C题目地址:http://codeforces.com/contest/1215/problem/C
题意 :有两个相同长度的字符串,都由”a“,”b“组成,两个字符串可互相交换任意位置的单个字符,问最少次数交换后两个字符串变为相同的,不能变为相同的作为输出”-1“。
思路:相同的肯定不用交换,看ab和ba的个数,奇数肯定不能变为一样的,两个ab或ba可一步变为相同的,ab和ba要两步。
AC代码:(水平有限,代码略长请谅解)
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 typedef long long ll; 6 int main(){ 7 int n; 8 cin>>n; 9 char s1[200005],s2[200005]; 10 for(int i=1;i<=n;i++) 11 cin>>s1[i]; 12 getchar(); 13 for(int i=1;i<=n;i++) 14 cin>>s2[i]; 15 int num_ab=0,num_ba=0; 16 int aa[200005]={0},ab[200005]={0}; 17 for(int i=1;i<=n;i++){ 18 if(s1[i]=='a'&&s2[i]=='b'){ 19 num_ab++; 20 aa[num_ab]=i; 21 } 22 else if(s1[i]=='b'&&s2[i]=='a'){ 23 num_ba++; 24 ab[num_ba]=i; 25 } 26 } 27 if((num_ab+num_ba)&1) cout<<"-1"<<endl; 28 else{ 29 if(num_ab&1){ 30 cout<<num_ab/2+num_ba/2+2<<endl; 31 for(int i=1;i<num_ab;i+=2) 32 cout<<aa[i]<<" "<<aa[i+1]<<endl; 33 for(int i=1;i<num_ba;i+=2) 34 cout<<ab[i]<<" "<<ab[i+1]<<endl; 35 cout<<aa[num_ab]<<" "<<aa[num_ab]<<endl<<aa[num_ab]<<" "<<ab[num_ba]<<endl; 36 } 37 else{ 38 cout<<(num_ab+num_ba)/2<<endl; 39 for(int i=1;i<=num_ab;i+=2) 40 cout<<aa[i]<<" "<<aa[i+1]<<endl; 41 for(int i=1;i<=num_ba;i+=2) 42 cout<<ab[i]<<" "<<ab[i+1]<<endl; 43 } 44 } 45 return 0; 46 }
D题目地址:http://codeforces.com/contest/1215/problem/D
题意:Monocarp 和 Bicarp两个人填车票数字(0~9),"?"表可填,数字表已有,若填完后前半段之和等于后半段之和,Bicarp胜,否则 Monocarp 胜,Monocarp 先填,车票总长和可填数都为偶数。
思路:直接考虑Bicarp的赢面,设前半段已知的和和后半段已知的和分别为sum1和sum2,前半段可填数为num1,后半段可填数为num2。当sum1等于sum2时,只有num1等于num2,Bicarp才能赢。
sum1 > sum2时,简单分析便可得出当sum2 -sum1要等于(num1-num2)*9/2,因为Bicarp 只能控制到(num1-num2)*9/2这个数。sum2 > sum1时同理。
AC代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 typedef long long ll; 6 int main(){ 7 int n; 8 cin>>n; 9 char c; 10 int num1=0,num2=0,sum1=0,sum2=0; 11 for(int i=1;i<=n;i++){ 12 cin>>c; 13 if(i<=n/2){ 14 if(c=='?') num1++; 15 else sum1+=(c-'0'); 16 } 17 else{ 18 if(c=='?') num2++; 19 else sum2+=(c-'0'); 20 } 21 } 22 bool flag; 23 if(sum1>sum2&&sum1-sum2==(num2-num1)*9/2) flag=false; 24 else if(sum1<sum2&&sum2-sum1==(num1-num2)*9/2) flag=false; 25 else if(sum1==sum2&&num1==num2) flag=false; 26 else flag=true; 27 if(flag) cout<<"Monocarp"<<endl; 28 else cout<<"Bicarp"<<endl; 29 return 0; 30 }
为什么感觉这两题比 B 题好写,太难受了。