题意:
给出字符串s包含'0' '1' '?';
再给出字符串t只包含01;
现在我们可以对S做三个操作;把0变成1,把?变成0或1,任意两个位置交换;
问最少操作几次s == t;
贪心 默认除去那些已经相同的 然后收集四种信息
共有三种不同的情况 直接模拟即可
#include<bits/stdc++.h> using namespace std; #define N 200000+5 int main() { int n;cin>>n; char a[N],b[N]; for(int kase=1;kase<=n;kase++) { int c=0; int one,zero;//代表a和b不同时 a为什么 int ask_one,ask_zero;//代表问号下面是几 one=zero=ask_one=ask_zero=0; scanf("%s%s",a,b); for(int i=0;i<strlen(a);i++) { if(a[i]==b[i])continue; if(a[i]=='1'&&b[i]=='0')one++; if(a[i]=='0'&&b[i]=='1')zero++; if(a[i]=='?') { if(b[i]=='0')ask_zero++; else ask_one++; } } if(zero>=one) c=zero+ask_one+ask_zero; else { if(one-zero>ask_one){c=-1;} else c+= ask_one+ask_zero+one; } printf("Case %d: %d ",kase,c); } return 0; }