習題 8-3 位元變換器(Bits Equalizer, SWERC 2012, UVa12545)
阿新 • • 發佈:2020-12-27
原題連結:https://vjudge.net/problem/UVA-12545
分類:貪心法
備註:簡單思維題
先看還少多少個’1’,如果s的’1’多餘t的‘1’肯定無解。
然後把少掉的這些’1’,全部用’?‘去變成’1’,如果’?‘有剩餘則變“0‘。
如果’?‘不夠,則要把遍歷一遍,當’1’的數量處於不足狀態時,把沒匹配的’0’變’1’。
最後會剩下2*k個位置不匹配的字元,兩兩交換,貢獻為k。
#include<bits/stdc++.h>
using namespace std;
const int maxn=105;
int n;
char s[maxn],t[maxn];
int main(void){
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%s%s",s,t);
printf("Case %d: ",i);
int len=strlen(s),num=0,cnt=0;//num求還少幾個'1'
for(int i=0;i<len;i++){
if(s[i]=='?')cnt++;
if(s[i]=='1')num--;
if(t[i]=='1')num++;
}
cnt-=num;
if(num<0){printf("-1\n");continue;}
int ans=0,num2=0;
for(int i=0;i<len; i++){
if(s[i]=='?'){
ans++;
if(t[i]=='1'){
if(num)s[i]='1',num--;
else s[i]='0',cnt--;
}else{
if(cnt)s[i]='0',cnt--;
else s[i]='1',num--;
}
}
}
for(int i=0;i<len;i++){
if(s[i]!=t[i]){
if(s[i]=='0'&&num)s[i]='1',ans++,num--;
else s[i]='1',num2++;
}
}
printf("%d\n",ans+num2/2);
}
return 0;
}