UVa #12545 Bits Equalizer (习题8-3)

86 篇文章 0 订阅

个人感觉突破点是0可以换成1,而1不能换成0。所以想到应该优先满足1-0(上1下0)的情况。而其它三种情况都只用简单变换就可以满足配对。


用0-1来进行swap显然是最快的,同时可以满足两组配对。

如果没有0-1了,那么可以用?-1。先换成0-1再swap。

如果两种都没有了,说明无解,因为下面的1是变不出来的,而我们现在还有上面的1未能配对。


把上面的1成功配对后,其他的都可以通过一次操作正确配对


由于不需打印过程,我们只需要记录四种组合(1-0、0-1、?-1、?-0)的数量即可,不需保存序列也不需保存0-0和1-1的数量


Run Time: 0.009s

#define UVa  "8-3.12545.cpp"
char fileIn[30] = UVa, fileOut[30] = UVa;

#include<cstring>
#include<cstdio>

using namespace std;

//Global Variables. Reset upon Each Case!
int C;
int one_zero, zero_one, q_one, q_zero;
int ans;
const int maxn = 100 + 5;
char s1[maxn], s2[maxn];
/

void init() {
    ans = 0;
    one_zero  = zero_one = q_one = q_zero = 0;
    scanf("%s", &s1);
    scanf("%s", &s2);
    for(int i = 0; i < strlen(s1); i ++) {
        if(s1[i] == '1' && s2[i] == '0') one_zero ++;
        else if (s1[i] == '0' && s2[i] == '1') zero_one ++;
        else if(s1[i] == '?' && s2[i] == '0') q_zero ++;
        else if(s1[i] == '?' && s2[i] == '1') q_one ++;
    }
}

int main() {
    scanf("%d", &C);
    for(int kase = 0; kase < C; kase ++) {
        init();
        while(one_zero && zero_one) {       //swap 1-0 and 0-1
            one_zero --;
            zero_one --;
            ans ++;
        }
        while(one_zero && q_one) {          //swap 1-0 and ?-1
            one_zero --;
            q_one --;
            ans += 2;
        }
        if(one_zero)
            ans = -1;
        else
            ans += zero_one + q_one + q_zero;
        printf("Case %d: %d\n", kase+1, ans);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值