【CF-1348 B】Phoenix and Beauty 思维

B. Phoenix and Beauty

题意

给出一个长度为n的整数数组\(a\)\(a[i]\leq n\),以及数字k,现在你可以向数组任意一个位置,

插入数字1-n,使得数组中长度为k的连续子数组和都相等,如果可以输出最后的数组,否

则输出-1。

思路

只需要把整个数组变成一个循环节长度为k的周期数组。

假设此时有\(num\)个不同的数字,如果\(num>k\),肯定不可以,

如果\(num<=k\),在最后随便加上1-n的几个数字凑够k个,输出N次所有不同的数字即可。

代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
const int inf=0x3f3f3f3f;
typedef long long ll;

int arr[N],brr[N],vis[N];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        memset(vis,0,sizeof(vis));
        int n,k,num=0;
        scanf("%d%d",&n,&k);
        for(int i=1; i<=n; i++)
        {
            scanf("%d",&arr[i]);
            if(!vis[arr[i]])
                num++;
            vis[arr[i]]=1;
        }
        if(num>k)
        {
            printf("-1\n");
            continue;
        }
        int tot=0;
        for(int i=1; i<=100; i++)
        {
            if(vis[i])
                brr[++tot]=i;
        }
        for(int i=tot+1;i<=k;i++) brr[i]=brr[i-1];
        printf("%d\n",n*k);
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=k;j++) printf("%d ",brr[j]);
        }
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/valk3/p/12968959.html