cf1348 B. Phoenix and Beauty(思维)

https://codeforces.com/contest/1348/problem/B

题意:

给一个长为 n 的数组,向其中随意插入元素,使任何长为 k 的连续子列的和相等

\(k,n\le 100\) ,新数组的长度不能超过 1e4

思路:

要使 \(a_1+a_2+a_3+a_4=a_2+a_3+a_4+a_5\) ,只需 \(a_1=a_5\)

所以新数组需满足 \(a_i=a_{i+k},\forall i\) ,也就是构造一个周期为 k 的周期序列。若原数组中的数字种类大于 k 则无法构造

因为范围很小,所以对原数组中的每个数,都插入 k-1 个数即可

#include <bits/stdc++.h>
using namespace std;

int n, k, a[110];

signed main()
{
    int T; scanf("%d", &T); while(T--)
    {
        vector<int> ve; memset(a, 0, sizeof a);
        scanf("%d%d", &n, &k);
        for(int i = 1; i <= n; i++)
        {
            int x; scanf("%d", &x);
            if(!a[x]) a[x] = 1, ve.push_back(x);
        }
        int len = ve.size();
        if(len > k)
        {
            puts("-1");
            continue;
        }
        while(len < k)
        { //直接让数组超级加倍到比k长
            for(int i = 0; i < len; i++)
                ve.push_back(ve[i]);
            len = ve.size();
        }
        printf("%d\n", n*k);
        while(n--) for(int i = 0; i < k; i++)
            printf("%d ", ve[i]);
        puts("");
    }

    return 0;
}

上一篇:x11 – 如何在chrooted环境中运行GUI Java app?


下一篇:x11 – 在没有GUI的情况下在服务器上启动GUI浏览器?