题目链接:http://codeforces.com/contest/814/problem/B
题意:给你两个长度为n的序列a和序列b,让你构造一个长度为n的序列p,1到n的每个数字都包含,使得p与序列a和序列b在对应位置都只有一个不同。(a,b不相同,p一定存在)。
分析:a和b的相同位置如果元素相同,那么构造的p对于位置也是这个元素,我们将vis[a[i]]=1。我们接下来找相同位置的元素不同的位置下标,然后看1到n这些数字有哪些元素vis[]=0,等于0代表这些元素还没有出现。如果ab只有一个位置元素不同,那么就将未出现的数字填入,输出即可。如果有两个位置不同,要想构造的p与a和b各只有一个位置不同,假设没出现的两个数字是num1和num2,那么当a[ans1]==num1&&b[ans2]==num2||a[ans2]==num2&&b[ans1]=num1时p[ans1]=num1,p[ans2]=num2.其他情况反正即可。
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int a[1005],b[1005],c[1005],d[1005]; 5 int main(){ 6 ios_base::sync_with_stdio(0); 7 cin.tie(0); 8 int n; 9 cin>>n; 10 for(int i=1;i<=n;i++){ 11 cin>>a[i]; 12 } 13 for(int i=1;i<=n;i++){ 14 cin>>b[i]; 15 } 16 int ans1=0,ans2=0; 17 memset(d,0,sizeof(d)); 18 for(int i=1;i<=n;i++){ 19 if(a[i]==b[i]){ 20 c[i]=a[i]; 21 d[a[i]]=1; 22 } 23 else { 24 if(ans1==0) ans1=i; 25 else ans2=i; 26 } 27 } 28 int num1=0,num2=0; 29 for(int i=1;i<=n;i++){ 30 if(d[i]==0){ 31 if(num1==0) num1=i; 32 else num2=i; 33 } 34 } 35 if(ans2==0){ 36 c[ans1]=num1; 37 } 38 else { 39 if(a[ans1]==num1&&b[ans2]==num2||a[ans2]==num2&&b[ans1]==num1){ 40 c[ans1]=num1; 41 c[ans2]=num2; 42 } 43 else { 44 c[ans1]=num2; 45 c[ans2]=num1; 46 } 47 } 48 for(int i=1;i<=n;i++){ 49 cout<<c[i]<<" "; 50 } 51 cout<<endl; 52 return 0; 53 }