作者: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;
}