題目鏈接
題目思路
其實自己差不多想到這個方面,但是還是沒有想透徹
爲了使某個數組的k美觀,該數組必須是週期爲k的週期。 如果數組a中存在超過k個不同的數字,則沒有答案,我們將打印-1(因爲數組不能以週期k爲週期)。 否則,我們提出以下構造。
考慮數組a中所有不同數字的列表。 如果少於k,我們將附加一些1(或任何其他數字),直到列表的大小爲k。 我們可以將此列表打印n次。 我們的數組b的長度是nk,永遠不超過1e4。可以始終通過在數組a中插入一些數字來構造數組b,因爲a中的每個數字都對應一個列表。
每個測試用例的時間複雜度:O(nlogn + nk)
代碼
#include <bits/stdc++.h>
using namespace std;
void solve(){
int N,K;
cin>>N>>K;
set<int>s;
for (int i=0;i<N;i++){
int a;
cin>>a;
s.insert(a);
}
//if more than K distinct numbers, print -1
if (s.size()>K){
cout<<-1<<endl;
return;
}
cout<<N*K<<endl;
for (int i=0;i<N;i++){
//print the distinct numbers
for(set<int>::iterator ite=s.begin();ite!=s.end();ite++)
cout<<*ite<<' ';
//print the extra 1s
for (int j=0;j<K-(int)s.size();j++)
cout<<1<<' ';
}
cout<<endl;
}
int main(){
int t; cin>>t;
while (t--)
solve();
}