https://vjudge.net/problem/UVA-12545

题意:输入两个等长的串S和T,其中S包含字符0,1,?,但T只包含0和1。

用尽量少的步数把S变成T。每步有3种操作:

①把S中的0变成1;②把S中的“?”变成0或者1;交换S中任意两个字符。

思路:题目不是很难。首先考虑交换,然后再看有多少不同的,就需要再加上多少次。

 #include<string>
#include<iostream>
#include<algorithm>
using namespace std; string s1, s2;
int cnt; void solve()
{
int l = s1.size();
cnt = ;
int num1 = , num2 = ;
for (int i = ; i < l; i++)
{
if (s1[i] == '') num1++;
if (s2[i] == '') num2++;
}
if (num1>num2)
{
cnt = -;
return;
} for (int i = ; i < l; i++)
{
if (s1[i] != s2[i] && s1[i] != '?')
{
for (int j = i + ; j < l; j++)
{
if (s1[j] == s2[i] && s2[j] == s1[i])
{
cnt++;
char temp;
temp = s1[i];
s1[i] = s1[j];
s1[j] = temp;
break;
}
}
}
}
for (int i = ; i < l; i++)
{
if (s1[i] != s2[i]) cnt++;
} } int main()
{
//freopen("D:\\txt.txt", "r", stdin);
int t, kase = ;
cin >> t;
while (t--)
{
cin >> s1 >> s2;
solve();
cout << "Case " << ++kase << ": " << cnt << endl;
} return ;
}
05-11 22:35