2018-10-05 19:07阅读: 150评论: 0推荐: 0

uva12545 Bits Equalizer

首先根据题意,既然0能变1,问号能变任何。那么不能变成T串的情况只能是S串中的1大于T串中1的个数。

然后考虑能够成为T串的情况。首先,不相同的0和不相同的1首先进行置换,因为这样置换只需进行一次操作,比其它任何情况都优。
交换次数为diff0 diff1中小的那个次,之后借由?再有2*(diff0 - diff1)次操作(先变再换),剩下的?变成对应的
不管是全剩1还是全剩0最终都是要进行每个两次操作。 最后的que-(diff0 - diff1)代表剩余的问号要进行的操作

复制代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int MAXN = 105;
char s[MAXN], t[MAXN];

int main()
{
    int T;
    (scanf("%d", &T);
    int kase = 1;
    while(T--)
    {

        scanf("%s%s", s, t);
        int s1 = 0, t1 = 0, len = strlen(s), d0 = 0, d1 = 0, que = 0;
        for(int i = 0; i < len; ++i)
        {
            if(s[i] == '1') ++s1;
            if(t[i] == '1') ++t1;
            if(s[i] == '?') ++que;
            if(s[i] != t[i] && s[i] == '0') ++d0;
            if(s[i] != t[i] && s[i] == '1') ++d1;
        }
        printf("Case %d: ", kase++);
        if(s1 > t1)
            printf("-1\n");
            //交换次数为diff0 diff1中小的那个次,之后借由?再有2*(diff0 - diff1)次操作(先变再换),剩下的?变成对应的
        else //不管是全剩1还是全剩0最终都是要进行每个两次操作。 最后的que-(diff0 - diff1)代表剩余的问号要进行的操作
        {
           int ans=min(d0,d1)+abs(d0-d1)*2+que-abs(d0-d1);
            printf("%d\n", ans);
        }
    }
    return 0;
}
复制代码

 

posted @   Erio  阅读(150)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起