CF

xiaoxiao2021-02-28  89

Codeforces Round #418 (Div. 2) B. An express train to reveries

题目传送门

题目描述:

  给定一个数n,给两个序列a和b,a和b中包含n个数。要求你找出一个序列,分别和a,b两个序列都有且仅有一个不一样的元素。并且序列中的元素是从1~n所有的数,并且这样的数一定存在。

解题思路:

  因为有且仅有一个不一样的元素,所以a与b序列中最多会有两个元素不一样。因此这道题可分为两种情况。第一种,有一个不一样,找出那个不一样的元素的下标,将那个数替换成1~n没有出现的数即可;第二种,有两个不一样,他只可能有两种不一样的情况就是保留对角线的数,然后判断序列是不是1~n不重复的即可。
代码部分:
#include <iostream> #include <stdio.h> #include <string.h> #include <set> #include <map> #include <algorithm> #include <string> using namespace std; int main() { int n; int a[2005],b[2005]; while(~scanf("%d",&n)) { int c[1005],d[1005]; map<int,int>M; for(int i=1; i<=n; i++) scanf("%d",&a[i]); for(int i=1; i<=n; i++) scanf("%d",&b[i]); int k=0; for(int i=1; i<=n; i++) { if(a[i]==b[i]) { c[i]=a[i]; M[a[i]]++; } else { d[k++]=i; } } if(k==1) { int s; for(int i=1;i<=n;i++) { if(M[i]==0) s=i; } c[d[0]]=s; } else { int t1=d[0]; int t2=d[1]; if(M[a[t1]]==0&&M[b[t2]]==0) { c[t1]=a[t1]; c[t2]=b[t2]; } else { c[t1]=b[t1]; c[t2]=a[t2]; } } for(int i=1; i<=n; i++) { if(i==1) printf("%d",c[i]); else printf(" %d",c[i]); } printf("\n"); } return 0; }
转载请注明原文地址: https://www.6miu.com/read-82922.html

最新回复(0)