12545 - Bits Equalizer(贪心?)

原创 2015年07月07日 20:03:24

这道题我是自己出的思路,一遍A的 ,0.000ms。 看网上的题解大多相仿,我就说说我的思路吧 。

假设字符串 a、b

我们只需要从前向后扫一遍就行了,遇到?跳过去,遇到a[i] = '0'&&a[i]!=b[i] ;那么就向后找一个a[j]=='1'&&a[i]!=b[j],也就是说先用交换这个技能比较省步骤 。如果没有可以交换的,再扫一遍找? 如果a[i]==? && b[i]==0  那么显然可以先将?变成1 再和a[i]交换  ,需要两步,如果仍然没有满足的,那只能直接把a[i]变成1

a[i]==1 && a[i]!=b[i]的情况和上面相仿,只是如果前两种无法满足,那么这个序列是无法变成b序列的

所以一开始就想清楚再敲代码比较好,将分类理清。

代码如下:

#include<bits/stdc++.h>
using namespace std;
int T,maxn = 0;
char a[105],b[105];
int main(){
    scanf("%d",&T);
    while(T--){
        scanf("%s%s",a,b);
        printf("Case %d: ",++maxn);
        int n = strlen(a);
        bool ok = true;
        int cnt = 0;
        for(int i=0;i<n;i++){
            if(a[i]=='?') continue;
            else if(a[i]!=b[i]&&a[i]=='0') {
                bool flage = false;
                for(int j=i+1;j<n;j++){
                    if(a[j]!=b[j]&&a[j]=='1') { flage = true; a[j] = '0'; a[i] = '1'; cnt++; break; }
                }
                if(!flage) {
                    for(int j=0;j<n;j++) {
                        if(a[j] == '?'&&b[j]=='0') { flage = true; a[j] = '0'; a[i] = '1'; cnt+=2;  break; }
                    }
                    if(!flage) { a[i] = '1'; cnt++; }
                }
            }
            else if(a[i]!=b[i]&&a[i]=='1') {
                bool flage = false;
                for(int j=i+1;j<n;j++) {
                    if(a[j]!=b[j]&&a[j]=='0') { flage = true; a[j] = '1'; a[i] = '0'; cnt++; break; }
                }
                if(!flage) {
                    for(int j=0;j<n;j++) {
                        if(a[j]=='?'&&b[j]=='1') { flage = true; a[j] = '1'; a[i] = '0'; cnt+=2; break; }
                    }
                    if(!flage) { ok = false; break; } //无法变换
                }
            }
        }
        if(ok) {
            for(int i=0;i<n;i++) if(a[i] == '?') cnt++; //别忘了这里
            printf("%d\n",cnt);
        }
        else printf("-1\n");
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

UVa:12545 Bits Equalizer(贪心)

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=845&page=show_pr...

UVA 12545 Bits Equalizer(瞎搞 贪心)

题意给定 两个字符串,第一个含有0,1,?;第二个含有0,1; 规定三种操作:把0 变成1,把?变成0或1,交换两个数字。 问,使用最少的操作数将第一个串变成第二个串。分析关键是寻找,最优的变换策...

习题8-3 UVA - 12545 Bits Equalizer(贪心)

题意: 输入两个字符串,第一个字符串包括0,1,?,  第二个字符串只包括0和1,问由第一个字符串转换到第二个字符串最少多少个操作? 其中操作有3个, 1.可以把问号变成1或者0。 2.可以交...

Uva - 12545 - Bits Equalizer

刚开始想了一个变换顺序,模拟进行操作,写了浩浩荡荡200多行最后WA了,感觉还是方法不对。。。后来从只能0变1,不能1变0入手,应该先满足上1下0的情况,其他的三种情况用简单的变换就可以了。 先用0...

uva 12545——Bits Equalizer

题意:给定两个等长的串s和t,其中s串包括0,1,?,T包含0,1,每次可以把s中的0变成1或者交换任意两个数或者?变成任意01.求由s到t的最小步数。 思路:杂。所有带?的都要变成0或则1...

Bits Equalizer 组队赛第二场Regionals 2012, Europe - Southwestern B题

题目:题目链接 题目总体来说不难 ,就是给你一个S串和一个T串,然后问你经过多少次操作可以将S串转换为T串。可以进行的操作有:将0变成1;将?变成 0或者1;交换S中的任意两个字符。 如果最终不能把S...

uva12545(贪心)

题意: 给出字符串s包含'0' '1' '?'; 再给出字符串t只包含01; 现在我们可以对S做三个操作;把0变成1,把?变成0或1,任意两个位置交换; 问最少操作几次s == t; ...

Codefroces 485C Bits【贪心+思维】好题

C. Bits time limit per test 1 second memory limit per test 256 megabytes input standard ...

Codeforces 484A - Bits (贪心)

题意 输出[l, r]中二进制数字最多的数字。 思路 贪心,从r的最高位1开始和l比较,直到pos[r] = 1, pos[l] = 0,这时候就可以把r的当前位置置零,之前...

codeforces C. Bits 贪心

C. Bits time limit per test 1 second memory limit per test 256 megabytes input sta...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)