您的位置:首页 > 其它

UVA-12545 Bits Equalizer (贪心)

2015-10-12 10:17 344 查看
题目大意:两个等长的字符串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;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: