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 题好写,太难受了。