#418(div2)B

Posted 早知如此绊人心,何如当初莫相识。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#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的主要内容,如果未能解决你的问题,请参考以下文章

#418(div2)A

Codeforces Round #418 (Div. 2) B

Codeforces Round #418 B

Codeforces Round #418 B--An express train to reveries

Codeforces Round #418 (Div. 2)

CF418E Tricky Password(未完待续)