Codeforces Round #585 (Div. 2) C. Swap Letters D. Ticket Game (思维)

链接: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;
}
发布了166 篇原创文章 · 获赞 68 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_42217376/article/details/100936998