[codeforces 1330A] Dreamoon and Ranking Collection 连续递增序列判定

Codeforces Round #631 (Div. 2) - Thanks, Denis aramis Shitov!   比赛人数10889

[codeforces 1330A]  Dreamoon and Ranking Collection   连续递增序列判定

总目录详见https://blog.csdn.net/mrcrack/article/details/103564004

在线测评地址https://codeforces.com/contest/1330/problem/A

Problem Lang Verdict Time Memory
A - Dreamoon and Ranking Collection GNU C++11 Accepted 31 ms 0 KB

这次比赛的题目都不简单,坑点很多。

读题是个很大的问题,

x代表什么,反复读题,结合样例解释,才能弄明白,

x是指未来的比赛场次,具体对应的比赛名次,可由编程者自定。

目的是让,名次能从1,2,3,......,v-1,v.

x若取得好,就可以让v值取最大。若不明白文字描述,请看如下数据模拟

样例数据,手工模拟如下

6 2
3 1 1 5 7 10

5
此组数据x=2,让这2场比赛名次分别是(2),(4)
可获得名次如下
1 1 (2) 3 (4) 5 7 10
可以发现,从名次1开始,连续名次,最大值是5

1 100
100

101
此组数据x=100,让这100场比赛名次分别是(1),(2),......,(98),(99),(101)
可获得名次如下
(1),(2),......,(98),(99),100,(101)
可以发现,从名次1开始,连续名次,最大值是101

11 1
1 1 1 1 1 1 1 1 1 1 1

2
此组数据x=1,让这1场比赛名次是(2)
可获得名次如下
1 1 1 1 1 1 1 1 1 1 1 (2)
可以发现,从名次1开始,连续名次,最大值是2

1 1
1

2
此组数据x=1,让这1场比赛名次是(2)
可获得名次如下
1 (2)
可以发现,从名次1开始,连续名次,最大值是2


4 57
80 60 40 20

60
此组数据x=57,让这57场比赛名次名次分别是
(1),(2),......,(18),(19),(21),(22),......,(38),(39),(41),(42),......(58),(59)
可获得名次如下
(1),(2),......,(18),(19),20,(21),(22),......,(38),(39),40,(41),(42),......(58),(59),60,80
可以发现,从名次1开始,连续名次,最大值是60

该题坑点较多,但样例数据若能通过,那么坑点也就基本跳过。

AC代码如下

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int cnt[210];
int main(){
	int t,n,x,i,v,a,k;
	scanf("%d",&t);
	while(t--){
		scanf("%d%d",&n,&x);
		memset(cnt,0,sizeof(cnt)),k=0;
		for(i=1;i<=n;i++)scanf("%d",&a),cnt[a]++;//cnt[a]统计a值是否出现过
		for(i=1;i<=200;i++)//根据题意,名词最大值可取到200
			if(cnt[i]==0){//i名次值未出现过
				k++;//用未来场次来填补
				if(k==x){//未来场次已用完
					v=i;
					break;
				}
			}
		for(i=v+1;i<=200;i++)//虽然未来场次已用完,但要看看,之后的数据是否还是连续的,请注意i取值自v+1开始
			if(cnt[i]==0)break;//数据断裂
			else v=i;//之后的数据是还是连续的,赋值给v
		printf("%d\n",v);
	}
	return 0;
}
发布了660 篇原创文章 · 获赞 562 · 访问量 48万+

猜你喜欢

转载自blog.csdn.net/mrcrack/article/details/105305747