给定一个串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 long using 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; }