1. 程式人生 > 其它 >習題 8-3 位元變換器(Bits Equalizer, SWERC 2012, UVa12545)

習題 8-3 位元變換器(Bits Equalizer, SWERC 2012, UVa12545)

技術標籤:《演算法競賽入門經典(第2版)》# 第八章

原題連結: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; }