Codeforces Round #418 (Div. 2)-B. An express train to reveries-思维

来源:互联网 发布:js删除cookie 编辑:程序博客网 时间:2024/05/20 18:41

给定一个串a和b
问你合成一个p
p和ab各有一个数字不用
我的方法是枚举两种情况。
1 当ab只有一个地方位置不同时,那么把这个位置换做没有出现过的i
2 当俩位置时,暴力枚举。

#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <vector>using namespace std;const int maxn=1005;int main(){   int m;    vector< pair<pair<int,int>,int> >q;    bool vis[maxn];    int a[maxn];    int b[maxn];    memset(vis,false,sizeof(vis));    scanf("%d",&m);    for(int i=1;i<=m;i++){        scanf("%d",&a[i]);    }    for(int i=1;i<=m;i++){        scanf("%d",&b[i]);    }    for(int i=1;i<=m;i++){        if(a[i]!=b[i]){           //q.push_back(make_pair(a[i],b[i]));        }        else            vis[a[i]]=true;    }    int ss[maxn];    for(int i=1;i<=m;i++){        if(a[i]!=b[i]){            q.push_back(make_pair(make_pair(a[i],b[i]),i));        }        else            {vis[a[i]]=true;            ss[i]=a[i];            }    }   if(q.size()==2){        if(!vis[q[0].first.first]&&!vis[q[1].first.second])        { ss[q[0].second]=q[0].first.first;          ss[q[1].second]=q[1].first.second;        }        else if(!vis[q[1].first.first]&&!vis[q[0].first.second])        {ss[q[1].second]=q[1].first.first;          ss[q[0].second]=q[0].first.second;        }        }        else        {    for(int i=1;i<=m;i++){               if(!vis[i]){                 ss[q[0].second]=i;break;               }               }        }        for(int i=1;i<=m;i++){             printf("%d ",ss[i]);        }    printf("\n");    return 0;}

第二个大佬的思想和我的差不多,
不过有一个地方不一样,他是求每一个没出现的数。

#include <bits/stdc++.h>#define MAXN 1005#define LL long longusing namespace std;int n;int a[MAXN];int visa[MAXN];int b[MAXN];int visb[MAXN];int c[MAXN];int main(int argc, char *argv[]){    // freopen("in.txt","r",stdin);    scanf("%d",&n);    for(int i=0;i<n;i++){        scanf("%d",&a[i]);        visa[a[i]]=true;    }    for(int i=0;i<n;i++){        scanf("%d",&b[i]);        visb[b[i]]=true;    }    vector<int>v;    for(int i=0;i<n;i++){        if(a[i]==b[i]){            c[i]=a[i];        }else{            c[i]=0;            v.push_back(i);        }    }    if(v.size()==1){//只有一个的时候        for(int i=1;i<=n;i++){            if(visa[i]==false&&visb[i]==false){                c[v[0]]=i;                break;            }        }    }else{//有两个位置不同的时候        int tmp1,tmp2;        for(int i=1;i<=n;i++){            if(visa[i]==false) tmp1=i;            if(visb[i]==false) tmp2=i;            //a没出现过的数,b没出现过的数。        }        c[v[0]]=tmp1;        c[v[1]]=tmp2;        int cur=0;        for(int i=0;i<n;i++){            if(a[i]!=c[i]){                cur++;            }        }        for(int i=0;i<n;i++){            if(b[i]!=c[i]){                cur++;            }        }        if(cur>2){            swap(c[v[0]],c[v[1]]);        }    }    for(int i=0;i<n;i++){        printf(i==0?"%d":" %d",c[i]);    }    printf("\n");    return 0;}
#include <bits/stdc++.h>/*我的思路是发现最多不同的地方只有两个。当为1的时候,肯定把两个都没有的i输出。当为2的时候,分为两种情况,如果一种不可以,另一种一定可以。第一个位置放a数组的数,二个位置为b或者相反。大神的思路:可以肯定的是第一个数组中最多只有一种数字会出现两次。还有就是正常出现的情况,除此之外没有其他情况。判断当哪个数字出现两次时,用那个没有出现的来判断。另一个大神的写法和我的差不多。*/using namespace std;const int maxn=2000;int a[maxn];int b[maxn];int m;bool jud(){    int c=0;    for(int i=1;i<=m;i++){        if(a[i]!=b[i])             c++;    }    if(c==1)return true;    return false;}int main(){    int vis[maxn];    memset(vis,0,sizeof(vis));    scanf("%d",&m);    for(int i=1;i<=m;i++){        scanf("%d",&a[i]);        vis[a[i]]++;    }    for(int i=1;i<=m;i++){        scanf("%d",&b[i]);    }    int t;    for(int i=1;i<=m;i++){        if(!vis[i])            t=i;    }    for(int i=1;i<=m;i++){        if(vis[a[i]]==2){              int old=a[i];              a[i]=t;              if(jud())break;               a[i]=old;        }    }    for(int i=1;i<=m;i++){        if(i==1){            printf("%d",a[i]);        }        else            printf(" %d",a[i]);    }    printf("\n");    return 0;}