Codeforces Round #638 (Div. 2) 比赛人数15215
[codeforces 1348B] Phoenix and Beauty 找周期
总目录详见https://blog.csdn.net/mrcrack/article/details/103564004
在线测评地址https://codeforces.com/contest/1348/problem/B
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
B - Phoenix and Beauty | GNU C++17 | Accepted | 62 ms | 0 KB |
比赛时,第一发WA了后,才意识到,初始化时,数据的范围有多么重要。
样例模拟如下
Input:
4
4 2
1 2 2 1
4 3
1 2 2 1
3 2
1 2 3
4 4
4 3 4 2
Output:
5
1 2 1 2 1
4
1 2 2 1
-1
7
4 3 2 1 4 3 2
4 2
1 2 2 1
周期是2,数组中的值只有2种,可行,故构造合理数据如下
原始数据 1 2 2 1
构造后的数据 (1 2) (1 2) (1 2) (1 2)
4 3
1 2 2 1
周期是3,数组中的值只有2种(自行再添加一个数3,构成3种),可行,故构造合理数据如下
原始数据 1 2 2 1
构造后的数据 (1 2 3) (1 2 3) (1 2 3) (1 2 3)
3 2
1 2 3
周期是2,数组中的值有3种,不可行,故构造不了合理数据
4 4
4 3 4 2
周期是4,数组中的值只有3种(自行再添加一个数1,构成4种),可行,故构造合理数据如下
原始数据 4 3 4 2
构造后的数据 (1 2 3 4) (1 2 3 4) (1 2 3 4) (1 2 3 4)
具体详见代码,AC代码如下
#include <cstdio>
#include <algorithm>
using namespace std;
int a[105],vis[105],c[105],cn;
int main(){
int t,i,b,n,k,cnt,j;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&k);
for(i=1;i<=100;i++)vis[i]=0;//此处很关键,初始化的边界不是n,而是100
for(i=1;i<=n;i++)scanf("%d",&a[i]),vis[a[i]]=1;//vis[i]=1表示,数据1出现过
cnt=0;
for(i=1;i<=100;i++)
if(vis[i])cnt++;//记录数组中的值不雷同的种类数量
if(cnt>k){printf("-1\n");continue;}//数组中的值不雷同的种类数量,过多
if(cnt<k)//数组中的值不雷同的种类数量,过少
for(i=1;i<=100;i++)
if(!vis[i]){
vis[i]=1,cnt++;//添加新值到周期中
if(cnt==k)break;
}
cn=0;
for(i=1;i<=100;i++)
if(vis[i])c[++cn]=i;//记录一个周期内,数组的值
printf("%d\n",n*k);
for(i=1;i<=n;i++)//打印数据
for(j=1;j<=k;j++)printf("%d ",c[j]);
printf("\n");
}
return 0;
}