http://acm.hdu.edu.cn/showproblem.php?pid=6095
给出n个人的力量值,再给一个k,进行n-1次挑选,每次挑选2个人比拼,相差大于k的大者赢,小者淘汰。小于k则当做没发过。问最后有多少人能有机会不会被淘汰。
因为是n-1次所以最坏情况只剩下一个人,那么意味着如果最后剩下一些人,那么可以得到的就是这些剩下的人里最大与最小不会超过k,那么就可以对这些数字排序,然后从大到小去比较,一旦找到一个位置,这两个人相差大于k,则跳出,那么前面的人数则为答案。
#include <bits/stdc++.h>
using namespace std;
#define ma(a) memset((a),0,sizeof((a)))
const int MOD=1000000;long long int a[111111];
int main(){
int t;
cin>>t;
while(t--)
{
int num;
long long int k;
scanf("%d%lld",&num,&k);
int i,j;
for(i=0;i<num;i++)
scanf("%lld",&a[i]);
long long int ans=0;
sort(a,a+num);
int js=0;;
i=num-2;
long long int maxx=a[num-1];
while(i>=0)
{
if(maxx-a[i]>k)
{
i--;
js++;
}
else {
maxx=a[i];
i--;
}
}
ans=num-js;
cout<<ans<<endl;
}
return 0;
}