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; }
-