codeforces 814B An express train to reveries

题目链接: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 }
View Code
原文地址:https://www.cnblogs.com/ls961006/p/6971668.html