http://acm.hdu.edu.cn/showproblem.php?pid=6095
题意:有n个选手,每个人的能力值为a[i]。他们进行两两对决,直到出现唯一胜者。对决的胜负判断是这样的:如果两个人的能力值满足|a[i]-a[j]|<=k,这两个人都有获胜的可能。反之,能力值大的胜,小的淘汰出局。输出有多少个人有可能成为这个唯一胜者。
题解:贪心思想,每次找第一大的和第二大的比,如果满足<=k。那么两个人都有可能获胜,反之只有一个可能获胜。排序遍历即可。
代码:
#include<bits/stdc++.h>
#define debug cout<<"aaa"<<endl
#define mem(a,b) memset(a,b,sizeof(a))
#define LL long long
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define MIN_INT (-2147483647-1)
#define MAX_INT 2147483647
#define MAX_LL 9223372036854775807i64
#define MIN_LL (-9223372036854775807i64-1)
using namespace std;
const int N = 100000 + 5;
const int mod = 1000000000 + 7;
int t,n,k,a[N],temp,ans;
int main(){
scanf("%d",&t);
while(t--){
ans=1;
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,a+n);
temp=a[n-1];
for(int i=n-1;i>=1;i--){
if(temp-a[i-1]<=k){
ans++;
}
else{
break;
}
temp=a[i-1];
}
printf("%d\n",ans);
}
return 0;
}