Circle Coloring(构造、思维)

题目描述

在这里插入图片描述

输入描述

在这里插入图片描述

输出描述

在这里插入图片描述

数据范围

在这里插入图片描述

输入样例

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 ,因此即使取特殊情况即每个数组中的元素都是同一个数字时(参见输入样例的第一组测试样例),仍然可以通过拿取当前位时保证与前一位不同,以满足题意要求。

扫描二维码关注公众号,回复: 13224504 查看本文章

因此本题的关键是在 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;
    }
}

猜你喜欢

转载自blog.csdn.net/laysan/article/details/119962469