作者:xq的acm之路
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3990
题目大意:给出字符串s包含’0’ ‘1’ ‘?’; 再给出字符串t只包含01; 现在我们可以对S做三个操作;把0变成1,把?变成0或1,任意两个位置交换; 问最少操作几次s == t;
思路:贪心算法即可
代码如下:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int main() { int n; cin>>n; for (int i = 1; i <= n; i++) { char s[101], t[101]; cin>>s>>t; int a = 0, b = 0, c = 0, d = 0; for (int i = 0; i < strlen(s); i++) { if (s[i] == '0'&& t[i] == '1') a++; if (s[i] == '1' && t[i] == '0') b++; if (s[i] == '?' && t[i] == '0') c++; if (s[i] == '?' && t[i] == '1') d++; } int sum = 0; while (a && b) { a--; b--; sum++; } while (b && d) { b--; d--; sum += 2; } if (b) sum = -1; else sum += a + c + d; cout<<"Case "<<i<<": "<<sum<<endl; } return 0; }