[Codeforces Round #638 (Div. 2)]B. Phoenix and Beauty

题意:给出一个n个数的序列a,如何可以插入几个数使其长度为k的子序列和相同,n=4,k=2,a = 1 2 2 1,一个答案是1 2 1 2 1,和都为3

假设前k个已经定好,那么易得a[k+1]==a[1],a[k+2]==a[2],这是一个循环,什么时候没有答案,n个数不同数的个数大于循环长度k。如n=3,k=2,a=1,2,3循环里只有2个数不能遍历a
如果有答案,那么随便找k个数构成循环节,只要保证a中每个数都在这k个数里面出现过就行

#include 
#include 
 
using namespace std;
 
int n,k,a[101],v[101],ans[10010],ta;
 
int main() {
    int t;
	cin >> t;
	while(t--) {
		cin >> n >> k;
		memset(v,0,sizeof v);
		for (int i = 1; i <= n; i++) {
		   cin >> a[i];
		   v[a[i]] = 1;
		}
		int q[200],tp = 0;
		for (int i = 0; i <= 100; i++)
		  if (v[i]) {
		  	q[++tp] = i;
		  }
		if (tp > k) 
		  cout << "-1\n";
		else {
			while (tp < k) {
				q[++tp] = q[1];
			} 
			int t = 1;
			ta = 0;
			while (t <= n) {
				for (int i = 1; i <= tp; i++) {
					if (q[i] == a[t]) t++;
					ans[++ta] = q[i];
				}
			}
			cout << ta << "\n";
			for (int i = 1; i <= ta; i++)
			  cout << ans[i] << " ";
			puts("");
		}
	} 
    return 0;
}

你可能感兴趣的:(OI/ACM,Solution)