Rikka with Competition

Rikka with Competition

给出一个大小为n的集合\(\{a_i\}\),每次从集合中随机挑出一对数\(a_i,a_j\),如果\(|a_i-a_j|>K\),那么从集合中删掉较小的那个数字,否则随机删掉一个数字,显然会有一个数字保留到最后,现在询问能够有可能保留到最后一个数字的数字个数,\(n\leq 10^5\)

序列无序,不妨排个序构成一个序列,显然序列最后一个元素必然有机会留到最后,此时考虑倒数第二个元素,如果它和最后一个元素的差的绝对值不超过K那么也有机会保留到最后。

于是我们得到一个做法,从最后一个元素往前扫描,如果它与后一个元素的差超过了K就break掉,那么这个元素后的所有元素都有机会保留到最后。

参考代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#define il inline
#define ri register
#define Size 105000
using namespace std;
int a[Size];
il void read(int&);
int main(){
	int lsy,n,k;read(lsy);
	while(lsy--){
		read(n),read(k);
		for(int i(1);i<=n;++i)
			read(a[i]);
		sort(a+1,a+n+1);
		int ans(1);
		for(int i(n-1);i;--i)
			if(a[i+1]-a[i]<=k)
				++ans;else break;
		printf("%d\n",ans);
	}
	return 0;
}
il void read(int &x){
	x^=x;ri char c;while(c=getchar(),c<'0'||c>'9');
	while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
}
posted @ 2019-08-25 17:03  a1b3c7d9  阅读(164)  评论(0编辑  收藏  举报