给出一个大小为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();
}
原文地址:https://www.cnblogs.com/a1b3c7d9/p/11408483.html
时间: 2024-10-21 00:16:36