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

  • 相关阅读:
    VSCode配置Python开发环境
    图像特征——边缘
    关于相机内参中的焦距fx和fy
    摄影变换和仿射变换
    为什么要引入齐次坐标
    链表一
    从小问题看懂链表
    类与对象
    排序一
    数组
  • 原文地址:https://www.cnblogs.com/xunzf0402/p/11545135.html
Copyright © 2020-2023  润新知