题意:给出串s1 ,包括0、1、?,给出串s2,仅包括0,1。
现在有三种操作
1.串s1的0变成1
2.串s1的任意两个字母交换
3.串s1的?变为0或者1
求最少多少次操作可以使得s1转化为s2,如果不能转化则输出-1
分析:贪心,对于已经匹配好的忽略,之后统计1-0,0-1,?-1,?-0的个数,贪心匹配即可
代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <map>
#include <stack>
#include <set>
#include <vector>
#include <cstring>
#include <queue>
#include <cmath>
#define FRER() freopen("in.txt","r",stdin);
#define FREW() freopen("out.txt","w",stdout);
#define mem(a,b) memset(a,b,sizeof(a));
#define go int T;scanf("%d",&T);for(int cas=1;cas<=T;cas++)
#define mod 1000000007
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;
const int maxn = 100 + 7;
char s1[maxn],s2[maxn];
int main() {
FRER();
FREW();
int k = 1;
go{
printf("Case %d: ",k++);
string s1,s2;
cin>>s1>>s2;
int len1 = s1.length();
int len2 = s2.length();
if(len1!=len2){
cout<<-1<<endl;
continue;
}
int cnt = 0;
int cnt1,cnt2,cnt3,cnt4;
cnt1 = cnt2 = cnt3 = cnt4= 0;
for(int i=0;i<=len1;i++){
if(s1[i]=='1'&&s2[i]=='0') cnt1++;
if(s1[i]=='?'&&s2[i]=='1') cnt2++;
if(s1[i]=='?'&&s2[i]=='0') cnt3++;
if(s1[i]=='0'&&s2[i]=='1') cnt4++;
}
//cout<<cnt1<<" "<<cnt2<<" "<<cnt3<<" "<<cnt4<<endl;
cnt+=(cnt3+cnt2);
if(cnt1==cnt4){
cnt+=cnt1;
}else if(cnt1<cnt4){
cnt+=cnt4;
}else{
if(cnt4+cnt2<cnt1){
cout<<-1<<endl;
continue;
}
cnt+=cnt4;
cnt+=(cnt1-cnt4);
}
cout<<cnt<<endl;
}
}