专栏文章
题解:P14173 【MX-X23-T3】猜拳游戏
P14173题解参与者 5已保存评论 4
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @minodvrm
- 此快照首次捕获于
- 2025/12/02 05:42 3 个月前
- 此快照最后确认于
- 2025/12/02 05:42 3 个月前
我们不妨先寻找 Alice 的出招序列 中的 与 Bob 的出招序列 中的 在什么时候会在同一局中出现,考虑 Alice 与 Bob 会进行 局游戏,所以可以认为是无限局游戏,那么只要 存在一对非负整数解 , 与 会在同一局中出现。又根据裴蜀定理, 存在一对非负整数解 的充要条件是 ,所以我们可以根据 或 对 的余数进行分组,分别记录 和 中对 余数相同的位置的
CPPRPS 个数分别是多少,代码如下: mp['P']=1;
mp['S']=2;
for(int i=0;i<n;i++)
cnt[i%l][mp[a[i]]]++;
for(int j=0;j<m;j++)
cnt1[j%l][mp[b[j]]]++;
接下来我们便可以对于每组进行计算贡献,由于每组中的 都满足 存在一对非负整数解 ,那么里面所有的 与 两两都会在某一局中同时出现,于是我们存在两种修改序列的方式:
- Alice 所有在这一组的位置的出招均为
RPS中的同一种 ,Bob 的则为RPS中的另两种,贡献为 Alice 所有在这一组的位置的出招不为 的个数加上 Bob 所有在这一组的位置的出招为 的个数; - Bob 所有在这一组的位置的出招均为
RPS中的同一种 ,Alice 的则为RPS中的另两种,贡献与第一种类似。
我们取每一组在上面两种方案中的最小值加到总贡献上即可算出答案。
CODE
CPP#include<bits/stdc++.h>
using namespace std;
int n,m,l,cnt[500005][3],cnt1[500005][3];
string a,b;
map<char,int> mp;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
l=__gcd(n,m);
cin>>a>>b;
mp['P']=1;
mp['S']=2;
for(int i=0;i<n;i++)
cnt[i%l][mp[a[i]]]++;
for(int j=0;j<m;j++)
cnt1[j%l][mp[b[j]]]++;
int ans=0;
for(int i=0;i<l;i++){
int k1,k2;
k1=min({cnt[i][0]+cnt[i][1]+cnt1[i][2],cnt[i][0]+cnt[i][2]+cnt1[i][1],cnt[i][2]+cnt[i][1]+cnt1[i][0]});
k2=min({cnt1[i][0]+cnt1[i][1]+cnt[i][2],cnt1[i][0]+cnt1[i][2]+cnt[i][1],cnt1[i][2]+cnt1[i][1]+cnt[i][0]});
ans+=min(k1,k2);
}
cout<<ans;
return 0;
}
相关推荐
评论
共 4 条评论,欢迎与作者交流。
正在加载评论...