洛谷 U139014 大使人选

洛谷 U139014 大使人选

洛谷传送门

题目背景

SeawaySeawa**y所效命的AlphaAlpha国和邪恶的EulerEuler国之间关系并不好,为了应付二国之间越来越频繁的外交交涉,AlphaAlpha国不得不更换一个更加能干的驻EulerEuler国特命全权大使。AlphaAlpha国人民委员会任命SeawaySeawa**y为外交部长,全面负责挑选合适的大使人选......

题目描述

大使应聘会上,SeawaySeawa**y面前站着清一色的NN名美女。(不是SeawaySeawa**y只选美女,是只有美女报名)。每名美女有一个美貌值b_ib**i。SeawaySeawa**y要从中挑选一位来出任大使。由于都是美女,SeawaySeawa**y要细细比较,不能大咧咧地刷掉长得太丑的。他的挑选策略是:每次挑出两名美貌值相差小于等于1的美女,并刷掉其中美貌值较小的。现在,SeawaySeawa**y想知道,他是否能够通过若干次挑选操作,挑出唯一的大使人选?

输入格式

从文件embassador.inembassado**r.i**n中读入数据。

第一行一个整数tt,表示测试数据组数。每组测试数据的第一行是一个整数NN,第二行是NN个整数,描述每个美女的美貌值b_ib**i

输出格式

输出到文件embassador.outembassado**r.out中。

对于每组数据,输出YESYES和NON**O来回答SeawaySeawa**y的问题。


命题背景:

加强了一下数据范围,我觉得10×105就挺大了,但是事实证明还可以更大。但是好像到不了106了,大约4×10^5吧。

而且10^5还能稍微欺骗一下选手,以为是log算法。

其实没啥问题啊,排序的确是log的。

题解:

一开始想奇偶,但很容易发现和奇偶无关。

于是我们想探究性质:由于每次删除较小值,所以最后剩下的一定是最大值。

而且一定是从小到大一个一个删除,要是跳跃了,就会出现有些点删不下去。

比如,4 5 6。肯定要先删除4再删除5,如果删除5,4就无法删除。

于是就是个排序。

枚举所有位置和它上面的位置,如果相差小于等于1,就把满足条件次数+1,最后只需要看次数是否是n-1即可。

代码:

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=110;
int n,cnt;
int a[maxn];
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		cnt=0;
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
			scanf("%d",&a[i]);
		sort(a+1,a+n+1);
		for(int i=1;i<n;i++)
			if(a[i]==a[i+1]||a[i]+1==a[i+1])
				cnt++;
		puts(cnt==n-1?"YES":"NO");
	}
	return 0;
}
原文地址:https://www.cnblogs.com/fusiwei/p/13913514.html