Bits Equalizer 组队赛第二场Regionals 2012, Europe - Southwestern B题

来源:互联网 发布:python 示例 编辑:程序博客网 时间:2024/05/22 14:27

题目:题目链接

题目总体来说不难 ,就是给你一个S串和一个T串,然后问你经过多少次操作可以将S串转换为T串。可以进行的操作有:将0变成1;将?变成 0或者1;交换S中的任意两个字符。 如果最终不能把S串转换成T串,则输出-1;

题目的意思很明确了,要想最少的次数,我们肯定先进行的就是交换,这样我们可以先找到(1,0)和(0,1)的组合,这样直接交换0和1.处理完这种情况后,我们需要考虑(?,1)这种情况,我们先尽量寻找(1,0)这种组合,交换(?,1)和(1,0)。没有的话就直接把?变成1就可以了。对于(?,0)的情况,直接把?变成0就可以了。因为他和交换的步数是一样的。so....上代码:

#include <iostream>#include <cstdio>#include <string>#include <string.h>#include <map>#include <vector>#include <cstdlib>#include <cmath>#include <algorithm>#include <cmath>#include <queue>#include <set>#include <stack>using namespace std;int main(){    int n;    scanf("%d", &n);    char s[150];    char t[150];    for(int i = 1; i <= n; ++i)    {        scanf("%s", s);        scanf("%s", t);        printf("Case %d: ", i);        int lens = strlen(s);        int lent = strlen(t);        if(lens < lent || lens > lent)        {            //cout << "111111111111111"<<endl;            printf("-1\n");            continue;        }        int cnt = 0;        for(int j = 0; j < lens; ++j)        {            if(s[j]==t[j])                continue;            else if(s[j]=='0'&&t[j]=='1')            {                for(int k = 0; k < lens; ++k)                {                    if(s[k]==t[k])                        continue;                    else if(s[k] == '1'&&t[k] =='0')                    {                        swap(s[j], s[k]);                        cnt++;                        break;                    }                }            }            else if(s[j]=='1'&&t[j]=='0')            {                for(int k = 0; k < lens; ++k)                {                    if(s[k]==t[k])                        continue;                    else if(s[k] == '0'&&t[k] =='1')                    {                        swap(s[j], s[k]);                        cnt++;                        break;                    }                }            }        }        for(int j = 0; j < lens; ++j)        {            //cout << "33333333333"<<endl;            if(s[j]==t[j])                continue;            else if(s[j]=='?' && t[j]=='1')            {                for(int k = 0; k < lens; ++k)                {                    if(s[k]==t[k])                        continue;                    else if(s[k]=='1'&&t[k]=='0')                    {                       // cout << "交换?和1对应的1和0"<<endl;                        swap(s[j], s[k]);                        s[k] = '0';                        cnt += 2;                        break;                    }                }                if(s[j]=='?')                {                    s[j] = '1';                    cnt++;                }            }            else if(s[j]=='?' && t[j]=='0')            {                s[j] = '0';                cnt++;            }            else if(s[j]=='0' && t[j]=='1')            {                s[j] = '1';                cnt++;            }        }        int flag = 0;        for(int j = 0; j < lens; ++j)        {            if(s[j]!=t[j])            {                flag = 1;                break;            }        }        if(flag == 0)            printf("%d\n", cnt);        else            printf("-1\n");    }    return 0;}

努力努力...

原创粉丝点击