您的位置:首页 > 其它

12545 - Bits Equalizer(贪心?)

2015-07-07 20:03 302 查看
这道题我是自己出的思路,一遍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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: