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;
}

  

posted @ 2015-10-12 10:17  20143605  阅读(191)  评论(0编辑  收藏  举报