[构造] aw3730. 寻找序列(模拟+构造)

Posted Ypuyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[构造] aw3730. 寻找序列(模拟+构造)相关的知识,希望对你有一定的参考价值。

1. 题目来源

链接:3730. 寻找序列

2. 题目解析

构造题目。

三个长度相同数组,在相同下标下,这三个数组元素各不相同。

要求使用这三个数组中的元素构造出一个新数组,使得新数组相邻两数不同,且首尾元素不同。


很明显可以直接构造,首先第一个元素在三个数组中首位元素任意选一个,然后后面直到倒数第二个都只需要和前一个保持不同即可。最后一个需要和倒数第二个且和第一个元素保持不同。

实际上,本题如果不加首尾元素不同这个要求的话,只需要两个数组就够了。


时间复杂度: O ( n ) O(n) O(n)

空间复杂度: O ( n ) O(n) O(n)


常规写法:

#include <bits/stdc++.h>

using namespace std;

const int N = 105;

int n;
int a[N], b[N], c[N];

int main() {
    int T; 
    cin >> T; 
    
    while (T -- ) {
        cin >> n;
        for (int i = 0; i < n; i ++ ) cin >> a[i];
        for (int i = 0; i < n; i ++ ) cin >> b[i];
        for (int i = 0; i < n; i ++ ) cin >> c[i];
        
        int last = -1;
        for (int i = 0; i < n - 1; i ++ ) {
            if (!i) {
                last = a[0];
                cout << last << ' ';
                continue;
            }
            
            if (last != a[i]) last = a[i];
            else if (last != b[i]) last = b[i];
            else if (last != c[i]) last = c[i];
            
            cout << last << ' ';
        
        }
        
        if (a[n - 1] != last && a[n - 1] != a[0]) cout << a[n - 1];
        else if (b[n - 1] != last && b[n - 1] != a[0]) cout << b[n - 1];
        else if (c[n - 1] != last && c[n - 1] != a[0]) cout << c[n - 1];
        
        cout << endl;
    }
    
    return 0;
}

y 总的写法,数据组织的不错:

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 110;

int n;
int a[4][N];

int main()
{
    int T;
    cin >> T;
    while (T -- )
    {
        cin >> n;
        for (int i = 0; i < 3; i ++ )
            for (int j = 0; j < n; j ++ )
                cin >> a[i][j];
        a[3][0] = a[0][0];
        for (int i = 1; i < n - 1; i ++ )
            for (int j = 0; j < 3; j ++ )
                if (a[3][i - 1] != a[j][i])
                {
                    a[3][i] = a[j][i];
                    break;
                }

        for (int i = 0; i < 3; i ++ )
            if (a[i][n - 1] != a[3][0] && a[i][n - 1] != a[3][n - 2])
            {
                a[3][n - 1] = a[i][n - 1];
                break;
            }
        for (int i = 0; i < n; i ++ ) cout << a[3][i] << ' ';
        cout << endl;
    }

    return 0;
}

以上是关于[构造] aw3730. 寻找序列(模拟+构造)的主要内容,如果未能解决你的问题,请参考以下文章

[构造] aw3763. 数字矩阵(构造+模拟+思维)

[构造] aw3732. 矩阵复原(模拟+构造)

使用 jest 模拟 AWS.DynamoDB.DocumentClient 的构造函数

[构造] aw3767. 最小的值(贪心+模拟)

LeetCode | 0106. Construct Binary Tree from Inorder and Postorder Traversal从中序与后序遍历序列构造二叉树Python(示(代

[构造] aw3764. 三元数异或(贪心+模拟)