题解:P14173 【MX-X23-T3】猜拳游戏
P14173 猜拳游戏 题解
题意简述
Alice 和 Bob 玩石头剪刀布,按一定的序列出招若干次。给定他们的出招序列,要求将两人的出招序列修改,使得两人的对局中不出现平局。求最小修改次数。
分析
将两人的出拳序列一一合并,容易得到两人的出拳序列每在
我们造一组数据进行分析:
令
:::align{center}
:::
我们发现
以此类推,令
解法
根据分析很容易得到解法。令
AC Code:
#include<iostream>
#define MAXN 500005
#define INF 0x3f3f3f3f
using namespace std;
int N,M,G;
string s1,s2;
int ans;
int a[MAXN],b[MAXN];
int na[MAXN][3],nb[MAXN][3];
int gcd(int a,int b){
if(b==1) return 1;
if(a%b==0) return b;
return gcd(b,a%b);
}
void init(){ //读入出拳类型
cin>>N>>M;
cin>>s1>>s2;
for(int i=0;i<N;i++){
if(s1[i]=='P') a[i]=1;
if(s1[i]=='S') a[i]=2;
}
for(int i=0;i<M;i++){
if(s2[i]=='P') b[i]=1;
if(s2[i]=='S') b[i]=2;
}
G=gcd(N,M);
for(int i=0;i<N;i++) na[i%G][a[i]]++;
for(int i=0;i<M;i++) nb[i%G][b[i]]++;
}
void solve(){
for(int i=0;i<G;i++){ //统计每组的最小代价
int cnt=INF;
cnt=min(cnt,na[i][0]+na[i][1]+nb[i][2]);
cnt=min(cnt,na[i][0]+nb[i][1]+na[i][2]);
cnt=min(cnt,nb[i][0]+na[i][1]+na[i][2]);
cnt=min(cnt,na[i][0]+nb[i][1]+nb[i][2]);
cnt=min(cnt,nb[i][0]+na[i][1]+nb[i][2]);
cnt=min(cnt,nb[i][0]+nb[i][1]+na[i][2]);
ans+=cnt;
}
cout<<ans<<endl; //输出答案
}
int main()
{
init();
solve();
return 0;
}