首页 > 代码库 > #418(div2)B

#418(div2)B

题意:输入n,代表有n种颜色,然后给出a,b2个数列,存在位置i,使得某个数列和a数列在i处不同,其他处相同,存在位置j,使得某个数列和b数列在j出不同,其他处相同,且某个数列中的数为1-n.

思路:在a数列中我们可以肯定有2个一模一样的颜色,b也是,那么a,b不同的的个数可能为0,1,2。好吧,考虑那么多导致我崩了。。。我们只要知道那2个位置必定有一个要改变,我就一个个判断,搞那么多花里胡哨的干嘛。。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 map<int ,int >ma,mb;
 4 int main(){
 5     int n;
 6     int a[1002],b[1002];
 7     cin>>n;
 8     int x=0,y=0;
 9     int sum=0;
10     int t=0;
11     for(int i=1;i<=n;i++) {
12         scanf("%d",&a[i]);
13         if(ma[a[i]]){
14             x=ma[a[i]];
15             y=i;
16         }
17         ma[a[i]]=i;
18     }
19     for(int i=1;i<=n;i++) {
20         scanf("%d",&b[i]);
21     }
22     for(int i=1;i<=n;i++){
23          if(i==a[x]) continue;
24 
25          sum=0;
26         for(int j=1;j<=n;j++){
27              if(j==x) {
28                 if(b[j]!=i) sum++;
29                 continue;
30              }
31               if(a[j]!=b[j]) sum++;
32         }
33         if(sum==1&&ma[i]==0){
34                 t=1;
35             a[x]=i;break;
36         }
37     }
38     if(t){
39         for(int i=1;i<=n;i++){
40         cout<<a[i]<<" ";
41         }
42       cout<<endl;return 0;
43     }
44 
45     for(int i=1;i<=n;i++){
46          if(i==a[y]) continue;
47 
48          sum=0;
49         for(int j=1;j<=n;j++){
50              if(j==y) {
51                 if(b[j]!=i) sum++;
52                 continue;
53              }
54               if(a[j]!=b[j]) sum++;
55         }
56         if(sum==1&&ma[i]==0){
57             a[y]=i;break;
58         }
59     }
60     for(int i=1;i<=n;i++){
61         cout<<a[i]<<" ";
62     }
63     cout<<endl;
64 }

 

#418(div2)B