UVA-12545 Bits Equalizer (贪心)
题目大意:两个等长的字符串p和q,p有‘0’,‘1’,‘?’组成,q由‘0’,‘1’组成。有三种操作:1.将‘?’变成0;2.将‘?’变成‘1’;3.交换同一字符串任意两个位置上的字符。问有p变到q最少需要几次操作。
题目分析:贪心。贪心策略:若两个位置上的字符相同,则不用处理;能交换位置便交换位置,这样能一次改变两个字符,优先交换‘0’,如果没‘0’再交换‘?’。
代码如下:
# include<iostream> # include<cstdio> # include<string> # include<cstring> # include<algorithm> using namespace std; string p,q; int main() { int T,cas=0; scanf("%d",&T); while(T--) { cin>>p>>q; int step=0,l=p.size(); for(int i=0;i<l;++i){ if(p[i]==q[i]) continue; if(p[i]!='1') continue; int flag=1; for(int j=0;j<l;++j){ if(p[j]==q[j]||i==j) continue; if(q[j]=='1'&&p[j]=='0'){ swap(p[i],p[j]); ++step; flag=0; break; } } if(flag){ for(int j=0;j<l;++j){ if(p[j]==q[j]||i==j) continue; if(q[j]=='1'&&p[j]=='?'){ swap(p[i],p[j]); ++step; break; } } } } for(int i=0;i<l;++i){ if(p[i]==q[i]||p[i]=='1') continue; p[i]=q[i]; ++step; } printf("Case %d: ",++cas); if(p==q) printf("%d\n",step); else printf("-1\n"); } return 0; }