uva 12542(贪心)

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn=100+10;
int t;
string s1,s2;
int main()
{
    scanf("%d",&t);
    for(int Case=1; Case<=t; Case++)
    {
        cin >> s1 >> s2;
        int snum=0,tnum=0,qnum=0,ans=0;
        for(int i=0; i<s1.length(); i++)
        {
            if(s2[i]=='0') tnum++;
            if(s1[i]=='0') snum++;
            if(s1[i]=='?')//'?'变化总需要一步
            {
                qnum++;
                ans++;
            }
            if(s2[i]=='0'&&s1[i]=='?')//'?'变成0,变化的步数在上面已经计算过了,所以不用再计算
            {
                s1[i]='0';
                qnum--;
                snum++;
            }
        }

        printf("Case %d: ",Case);
        if(qnum+snum-tnum<0)//如果?和0的数量少于需要达到的目标数,则永远不会成立
        {
            printf("-1\n");
            continue;
        }
        int sub=tnum-snum;
        if(sub>0) ans+=sub;//起始串和目标串之间的差值,即?变成0,然后移动
        for(int i=0; i<s1.length(); i++)
        {
            if(s1[i]=='0'&&s2[i]=='1')//将非?变成的0变成1,因为?变成的0必然一一对应目标串相同位置的0,所以这里必然不是
                ans++;
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/Wangwanxiang/p/8454408.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值