题目描述
输入描述
输出描述
数据范围
输入样例
5
3
1 1 1
2 2 2
3 3 3
4
1 2 1 2
2 1 2 1
3 4 3 4
7
1 3 3 1 1 1 1
2 4 4 3 2 2 4
4 2 2 2 4 4 2
3
1 2 1
2 3 3
3 1 2
10
1 1 1 2 2 2 3 3 3 1
2 2 2 3 3 3 1 1 1 2
3 3 3 1 1 1 2 2 2 3
输出样例
1 2 3
1 2 1 2
1 3 4 3 2 4 2
1 3 2
1 2 3 1 2 3 1 2 3 2
披着中等难度的皮的简单构造题,由于三个数组中相同下标的 a ≠ b ≠ c ,因此即使取特殊情况即每个数组中的元素都是同一个数字时(参见输入样例的第一组测试样例),仍然可以通过拿取当前位时保证与前一位不同,以满足题意要求。
因此本题的关键是在 a b c 三数中选取其中一个存入新数组中时维护该数的值,并进入下一位。下一位可直接对比 a 是否与维护的值相同,若不同则存入新数组,并维护 a 的值;若相同则继续对比 b 是否相同,同理可继续对比 c 即可。
坑点是!!最后一个需要特判,因为头尾也不能相同。
参考代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int a[150],b[150],c[150],p[150];
int main()
{
int T;cin>>T;
while (T--)
{
int n;cin>>n;
for (int i = 1; i <= n; i ++ )cin>>a[i];
for (int i = 1; i <= n; i ++ )cin>>b[i];
for (int i = 1; i <= n; i ++ )cin>>c[i];
cout<<a[1];
p[1]=a[1];
for(int i=2;i<=n-1;i++)
{
if(a[i]!=p[i-1]){cout<<' '<<a[i];p[i]=a[i];}
else if(b[i]!=p[i-1]){cout<<' '<<b[i];p[i]=b[i];}
else if(c[i]!=p[i-1]){cout<<' '<<c[i];p[i]=c[i];}
}
if(a[n]!=p[n-1]&&a[n]!=p[1])cout<<' '<<a[n];
else if(b[n]!=p[n-1]&&b[n]!=p[1])cout<<' '<<b[n];
else if(c[n]!=p[n-1]&&c[n]!=p[1])cout<<' '<<c[n];
cout << endl;
}
}