zoukankan      html  css  js  c++  java
  • UVA12545-Bits Equalizer(思维)

    Problem UVA12545-Bits Equalizer

    Accept: 821  Submit: 4548
    Time Limit: 3000 mSec

    Problem Description

    Input

    The first line of input is an integer C (C ≤ 200) that indicates the number of test cases. Each case consists of two lines. The first line is the string S consisting of ‘0’, ‘1’ and ‘?’. The second line is the string T consisting of ‘0’ and ‘1’. The lengths of the strings won’t be larger than 100.

     Output

    For each case, output the case number first followed by the minimum number of moves required to convert S into T. If the transition is impossible,output ‘-1’ instead.
     

     Sample Input

    3
    01??00
    001010
    01
    10
    110001
    00000
     

     Sample Output

    Case 1: 3

    Case 2: 1

    Case 3: -1

    题解:这个题还是挺不错的,结论很简洁,但是不是太好想。首先明确一点就是要进行几步操作和字符串的顺序无关,只和对应位置的对应情况有关,一共由四种对应:

    1、0 --> 1

    2、1 --> 0

    3、?--> 1

    4、?--> 0

    分别记录个数为cnt[1~4],首先cnt[3、4]是肯定要加进去的,只需考虑别的步骤,2这种对应只能通过交换来消除,所以如果cnt1+cnt3<cnt2,就是无解的,否则答案就是在原来的基础上加上max(cnt1, cnt2).

    解释一下,如果cnt1 >= cnt2,那么只用1这种对应来交换的就已经足够了,还需要把多出来的1对应变成正确对应因此此时加上cnt1,如果cnt1 < cnt2,这时需要用3对应来配,此时需要cnt2步操作,因此就是在cnt[3、4]的基础上加上二者最大值。

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 int T = 1;
     6 
     7 int main()
     8 {
     9     //freopen("input.txt", "r", stdin);
    10     int iCase;
    11     scanf("%d", &iCase);
    12     while (iCase--) {
    13         string ori, tar;
    14         cin >> ori >> tar;
    15 
    16         int cnt = 0, cnt2 = 0, cnt3 = 0, cnt4 = 0;
    17         int len = ori.length(); 
    18         for (int i = 0; i < len; i++) {
    19             if (ori[i] == '0' && tar[i] == '1') {
    20                 cnt++;
    21             }
    22             else if (ori[i] == '1' && tar[i] == '0') {
    23                 cnt2++;
    24             }
    25             else if (ori[i] == '?') {
    26                 if (tar[i] == '1') cnt3++;
    27                 else cnt4++;
    28             }
    29         }
    30 
    31         if (cnt + cnt3 < cnt2) {
    32             printf("Case %d: %d
    ", T++, -1);
    33         }
    34         else {
    35             int ans = cnt3 + cnt4;
    36             ans += max(cnt, cnt2);
    37             printf("Case %d: %d
    ", T++, ans);
    38         }
    39     }
    40     return 0;
    41 }
  • 相关阅读:
    ant脚本打jar包 自动获取时间以及项目svn版本号
    15分钟学会git基本的操作命令
    java后端模拟表单提交
    优秀js插件收藏
    javascript操作
    javascript常用方法整理--数组篇
    javascript exec方法
    javascript 拷贝
    自执行函数简单应用
    jsonp跨域原理解析
  • 原文地址:https://www.cnblogs.com/npugen/p/9683662.html
Copyright © 2011-2022 走看看