UVA 12545 Bits Equalizer (贪心)

题意:给出串s1 ,包括0、1、?,给出串s2,仅包括0,1。

           现在有三种操作

                  1.串s1的0变成1

                  2.串s1的任意两个字母交换

                  3.串s1的?变为0或者1

           求最少多少次操作可以使得s1转化为s2,如果不能转化则输出-1

分析:贪心,对于已经匹配好的忽略,之后统计1-0,0-1,?-1,?-0的个数,贪心匹配即可

代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <map>
#include <stack>
#include <set>
#include <vector>
#include <cstring>
#include <queue>
#include <cmath>
#define FRER() freopen("in.txt","r",stdin);
#define FREW() freopen("out.txt","w",stdout);
#define mem(a,b) memset(a,b,sizeof(a));
#define go int T;scanf("%d",&T);for(int cas=1;cas<=T;cas++)
#define mod 1000000007
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;
const int maxn = 100 + 7;
char s1[maxn],s2[maxn];
int main() {
    FRER();
    FREW();
    int k = 1;
    go{
        printf("Case %d: ",k++);
        string s1,s2;
        cin>>s1>>s2;
        int len1 = s1.length();
        int len2 = s2.length();
        if(len1!=len2){
            cout<<-1<<endl;
            continue;
        }
        int cnt = 0;
        int cnt1,cnt2,cnt3,cnt4;
        cnt1 = cnt2 = cnt3 = cnt4= 0;
        for(int i=0;i<=len1;i++){
            if(s1[i]=='1'&&s2[i]=='0') cnt1++;
            if(s1[i]=='?'&&s2[i]=='1') cnt2++;
            if(s1[i]=='?'&&s2[i]=='0') cnt3++;
            if(s1[i]=='0'&&s2[i]=='1') cnt4++;
        }
        //cout<<cnt1<<" "<<cnt2<<" "<<cnt3<<" "<<cnt4<<endl;
        cnt+=(cnt3+cnt2);
        if(cnt1==cnt4){
            cnt+=cnt1;
        }else if(cnt1<cnt4){
            cnt+=cnt4;
        }else{
            if(cnt4+cnt2<cnt1){
                cout<<-1<<endl;
                continue;
            }
            cnt+=cnt4;
            cnt+=(cnt1-cnt4);
        }
        cout<<cnt<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/Insist_77/article/details/84595104