CodeForces 1348-B Phoenix and Beauty(思维、子序列和相等)

 CodeForces 1348-B Phoenix and Beauty(思维、子序列和相等)

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

 

 

 

 

题意:

给出一个n个数的序列a,可以向这个序列中的任意地方插入1-n中的数,问是否可以使得插入过后这个序列其长度为k的任意子序列和相同。

 

解题思路:

这题不要求插入最少的数,那么我们直接搞起:

我们先用set记录这个序列中有多少个不同的数字,如果这个序列中存在超过k个不同的数字,则没有答案,输出-1。

如果序列中存在小于k个不同的数字,那么我们随便添点1-n中数字,把set中的元素个数补至k个。

然后我们把原序列中的每个数字都替换成set中的序列段即可(因为这个序列段一定含有当前这个数字),最后一共有n*k个数字。

 

具体看代码:

#include <bits/stdc++.h>
typedef long long LL;
#define pb push_back
const int INF = 0x3f3f3f3f;
const double eps = 1e-8;
const int mod = 1e9+7;
const int maxn = 1e5+10;
using namespace std;

int a[maxn];

int main()
{
    #ifdef DEBUG
    freopen("sample.txt","r",stdin); //freopen("data.out", "w", stdout);
    #endif
    
    int T;
    scanf("%d",&T);
    while(T--)
    {
        vector<int> vt;
        set<int> st;
        int n,k;
        scanf("%d %d",&n,&k);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            st.insert(a[i]);
        }
        if(st.size()>k)
        {
            printf("-1\n");
            continue;
        }
        for(int i=1;i<=n;i++)//将set中的元素补至k个
        {
            if(st.size()==k) break;
            if(!st.count(i)) st.insert(i);
        }
        printf("%d\n",n*k);
        for(int i=1;i<=n;i++)//将每个数字替换成set中的序列段
        {
            for(auto it : st)
                printf("%d ",it);
        }
        printf("\n");
    }
    
    return 0;
}

 

-

posted @ 2020-05-02 15:22  jiamian22  阅读(360)  评论(0编辑  收藏  举报