题意:给长度为n的两个序列a,b,找出一个序列c使得序列c分别与a,b序列相差一个数
长度为n的序列包含1-n的每一个数 输出序列c满足条件的一种序列。
题解:序列a,b只存在两种可能 1有一个数不同 2有两个数不同
首先输入a,b数组,比较a b数组在每个位置上的数是否相同,相同则放入数组d,并用vis数组做标记此数已经访问
不相同则将该位置记录在向量q中
向量q则记录量数组在哪一个(两个)位置上不同
若有2个数不同,访问vis数组,如果vis[i]=0说明i在c数组中没有出现,将i放入向量中
此时向量q前两个数是数组a,b不相同的位置(数组c没有值得位置),后两个数是数组c中没有出现的数
有2中可能0和2,1和3 0和3,1和2根据已知条件判断为哪种情况
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<vector> using namespace std; int a[1005],b[1005],c[1005],n; int vis[1005]; int main() { int n; while(cin>>n) { vector<int>q; memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } int ans=0; for(int i=1;i<=n;i++) { scanf("%d",&b[i]); if(a[i]==b[i]) { vis[a[i]]=1;//将两数组相同时的数做标记 c[i]=b[i];//并赋值给c数组 } else { q.push_back(i);//将不相同的位置记录下来 ans++;//记录有几个数不同 } } if(ans==1)//只有一个数不同 { for(int i=1;i<=n;i++) { if(!vis[i])//i不存在 c[q[0]]=i; //第q[0]个位置的数为i } } else { int res1=0,res2=0; for(int i=1;i<=n;i++) { if(!vis[i])//查看那两个数在c数组中没有出现 { q.push_back(i); } } c[q[0]]=q[2],c[q[1]]=q[3]; for(int i=1;i<=n;i++)//判断0和2 1和3这种情况是否成立 { if(a[i]!=c[i]) res1++; if(b[i]!=c[i]) res2++; } if(res1==res2&&res1==1);//成立 else //重新赋值 c[q[0]]=q[3],c[q[1]]=q[2]; } for(int i=1;i<=n;i++) printf("%d ",c[i]); printf("\n"); } return 0; }