题目链接:http://codeforces.com/contest/814/problem/B
题意:给你两个长度为n的序列a,b,让你求一个序列p,他满足,和a有一个元素不同,和b有一个元素不同,且是n的全排列,让你输入任意一种满足题意的序列p
解析:首先有两种情况,a和b有一个不同,那么那一个不同的应该就是n个元素里除去n-1个相同的剩下的,第二种情况就是a和b有两个不同,那么这两个位置就有两种情况,那么你把这两种情况都试一下就可以了(代码有点丑
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1005;
int a[maxn];
int b[maxn];
int c[maxn];
int vis[maxn];
int main(void)
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n;i++)
scanf("%d",&b[i]);
memset(vis,0,sizeof(vis));
vector<int>tmp;
int cnt = 0;
for(int i=0;i<n;i++)
{
if(a[i]==b[i])
{
c[i] = a[i];
vis[a[i]] = 1;
}
else
{
cnt++;
tmp.push_back(i);
}
}
if(cnt==1)
{
for(int i=0;i<n;i++)
{
if(c[i]==0)
{
for(int j=1;j<=n;j++)
{
if(vis[j]==0)
{
c[i] = j;
break;
}
}
break;
}
}
}
else
{
int cnt1 = 0,cnt2 = 0;
for(int i=1;i<=n;i++)
{
if(!vis[i])
tmp.push_back(i);
}
c[tmp[0]] = tmp[2],c[tmp[1]] = tmp[3];
for(int i=0;i<n;i++)
{
if(a[i]!=c[i])
cnt1++;
if(b[i]!=c[i])
cnt2++;
}
if(cnt1==cnt2 && cnt1==1);
else
c[tmp[0]] = tmp[3],c[tmp[1]] = tmp[2];
}
for(int i=0;i<n;i++)
printf("%d ",c[i]);
puts("");
return 0;
}