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
Sample Input
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\n", T++, -1); 33 } 34 else { 35 int ans = cnt3 + cnt4; 36 ans += max(cnt, cnt2); 37 printf("Case %d: %d\n", T++, ans); 38 } 39 } 40 return 0; 41 }