Codeforces Round #585 (Div. 2) C,D

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

原文地址:https://www.cnblogs.com/xunzf0402/p/11545135.html