首先根据题意,既然0能变1,问号能变任何。那么不能变成T串的情况只能是S串中的1大于T串中1的个数。
然后考虑能够成为T串的情况。首先,不相同的0和不相同的1首先进行置换,因为这样置换只需进行一次操作,比其它任何情况都优。
交换次数为diff0 diff1中小的那个次,之后借由?再有2*(diff0 - diff1)次操作(先变再换),剩下的?变成对应的
不管是全剩1还是全剩0最终都是要进行每个两次操作。 最后的que-(diff0 - diff1)代表剩余的问号要进行的操作
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> using namespace std; const int MAXN = 105; char s[MAXN], t[MAXN]; int main() { int T; (scanf("%d", &T); int kase = 1; while(T--) { scanf("%s%s", s, t); int s1 = 0, t1 = 0, len = strlen(s), d0 = 0, d1 = 0, que = 0; for(int i = 0; i < len; ++i) { if(s[i] == '1') ++s1; if(t[i] == '1') ++t1; if(s[i] == '?') ++que; if(s[i] != t[i] && s[i] == '0') ++d0; if(s[i] != t[i] && s[i] == '1') ++d1; } printf("Case %d: ", kase++); if(s1 > t1) printf("-1 "); //交换次数为diff0 diff1中小的那个次,之后借由?再有2*(diff0 - diff1)次操作(先变再换),剩下的?变成对应的 else //不管是全剩1还是全剩0最终都是要进行每个两次操作。 最后的que-(diff0 - diff1)代表剩余的问号要进行的操作 { int ans=min(d0,d1)+abs(d0-d1)*2+que-abs(d0-d1); printf("%d ", ans); } } return 0; }