链接:https://codeforces.com/contest/1215
来源:Codeforces Round #585 (Div. 2)
C. Swap Letters
题意:给你两个字符串,问最少需要交换多少次可以使这两个字符串相等,并且输出交换方案?
思路:如果两个字符串不同,那么出现的情况一定是 a b 或者 b a 如果出现成对的 a b 或者 b a ,二者交换即可,如果最后剩余 a1 b1 和 b2 a2;那就让a1 和 b2 交换,随后按照上述方法进行交换即可,如果不匹配的字母中,a 的数量不等于 b的数量说明无法使这两个串相等。
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> P;
typedef long long ll;
const int Max_n=2e5+10;
char a[Max_n],b[Max_n];
vector<P>ans;
vector<int>va,vb;
int main(){
int n;
scanf("%d",&n);
scanf("%s%s",a+1,b+1);
for(int i=1;i<=n;i++){
if(a[i]!=b[i]){
if(a[i]=='a') va.push_back(i);
else vb.push_back(i);
}
}
//cout<<va.size()<<"---"<<vb.size()<<endl;
if(va.size()%2!=vb.size()%2) puts("-1");
else{
for(int i=0;i+1<(int)va.size();i+=2) ans.push_back(P(va[i],va[i+1]));
for(int i=0;i+1<(int)vb.size();i+=2) ans.push_back(P(vb[i],vb[i+1]));
if(va.size()%2){
ans.push_back(P(va[va.size()-1],va[va.size()-1]));
ans.push_back(P(va[va.size()-1],vb[vb.size()-1]));
}
printf("%d\n",(int)ans.size());
for(int i=0;i<(int)ans.size();i++) printf("%d %d\n",ans[i].first,ans[i].second);
}
return 0;
}
D. Ticket Game
题意:给你一个字符串(偶数个字符),里面包含了偶数个问号,然后 M 和 B 玩游戏,M 为先手,二人可以将其中任何一个问号变成 0 - 9 的数字,直到问号全部变成数字。如果最后前半部分的数字和等于后半部分的数字和,那么 B 获胜,否则 M 获胜。
思路:如果 M 在任意一部分阻止二者相等,那么 B 就可以在另外一部分促进二者相等,所以两边有等量的问号是等效的,那么只需要考虑当左边的问号多和右边问号多的情况:1.左边 cntl 的问号多,去掉和右边等效的问号剩余 cntl -= cntr,此时如果 suml >= sumr,M 必胜,suml < sumr 的时候 ,我们考虑极限情况如果 M 操作是把属于他的问号全部变成了 9 ,即 cntl = cntl / 2 * 9 ,如果 cntl + suml > sumr,无论 B 的操作是什么都会输,假设只有 B 的操作把属于他的问号全部变成了 9 ,那么当 cntl +suml < sumr 时,B 会输掉游戏,所以这种情况下,只有 cntl + suml = sumr 时 B 可以获胜。2.右边问号多,去掉左边等效的问号剩余 cntr -= cntl,此时如果 sumr >= suml,M 必胜,sumr < suml 的时候,考虑极限情况,如果 M 把所有可操作的位置变成 9 ,cntr = cntr / 2 * 9 ,如果 cntr + sumr > suml , M 必胜,如果 B 把所有可操作的数变成 9,并且 cntr + sumr < suml,M 必胜,综上所述,这种情况下,如果 cntr + sumr = suml ,B 必胜,否则 M 必胜。
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> P;
typedef long long ll;
const int Max_n=2e5+10;
char a[Max_n];
int main(){
int n;
scanf("%d",&n);
scanf("%s",a+1);
int cntl=0,cntr=0,suml=0,sumr=0;
for(int i=1;i<=n;i++){
if(i<=n/2){
if(a[i]=='?') cntl++;
else suml+=a[i]-'0';
}else{
if(a[i]=='?') cntr++;
else sumr+=a[i]-'0';
}
}
//cout<<cntl<<" cnt "<<cntr<<endl;
//cout<<suml<<" sum "<<sumr<<endl;
if(cntl==cntr){
if(suml==sumr) puts("Bicarp");
else puts("Monocarp");
}else if(cntl<cntr){
cntr-=cntl; cntr=cntr/2*9;
if(cntr+sumr==suml) puts("Bicarp");
else puts("Monocarp");
}else{
cntl-=cntr; cntl=cntl/2*9;
if(cntl+suml==sumr)puts("Bicarp");
else puts("Monocarp");
}
return 0;
}