[codeforces 1348B] Phoenix and Beauty 找周期

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

ProblemLangVerdictTimeMemory
B - Phoenix and Beauty GNU C++17Accepted62 ms0 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;
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值