#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的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #418 (Div. 2) B
Codeforces Round #418 B--An express train to reveries