HDU 6095 思维题

Rikka with Competition

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 150    Accepted Submission(s): 123


Problem Description
As we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Rikka some math tasks to practice. There is one of them:

A wrestling match will be held tomorrow.  n  players will take part in it. The  i th player’s strength point is  ai .

If there is a match between the  i th player plays and the  j th player, the result will be related to  |aiaj| . If  |aiaj|>K , the player with the higher strength point will win. Otherwise each player will have a chance to win.

The competition rules is a little strange. Each time, the referee will choose two players from all remaining players randomly and hold a match between them. The loser will be be eliminated. After  n1  matches, the last player will be the winner.

Now, Yuta shows the numbers  n,K  and the array  a  and he wants to know how many players have a chance to win the competition.

It is too difficult for Rikka. Can you help her?  
 

Input
The first line contains a number  t(1t100) , the number of the testcases. And there are no more than  2  testcases with  n>1000 .

For each testcase, the first line contains two numbers  n,K(1n105,0K<109) .

The second line contains  n  numbers  ai(1ai109) .
 

Output
For each testcase, print a single line with a single number -- the answer.
 

Sample Input
  
  
2 5 3 1 5 9 6 3 5 2 1 5 9 6 3
 

Sample Output
  
  
5 1
 

Source
 
题意 : 输入两个值 n k,表示有n名选手要摔跤,当两名选手的战斗力差值大于 k 的时候,大的一方稳赢,否则两人都有可能赢。问你最多有多少人有机会赢得比赛
第一组数据 : 5 3      1 5 9 6 3
首先 9 最大,它一定是有可能赢得所有比赛得,6与9之间得差值不大于3,所以它也有可能赢得比赛,如果6赢了9,那么 5 也有机会赢了 6 ,那么5也有机会赢得比赛,同理 5 与 3差值小于3,3与1差值小于3,所以每个人都有机会赢得比赛
思路:先从大到小排序之后,让战斗力最大得两个人PK,如果差值不大于K,那么两个人都能赢,让战斗力小的去跟下个人PK,这样能使下个人赢的机会变大,如果差值小于k则继续,大于k的话,那么剩下的人也都不可能打赢他了,那么后面的人就都没机会赢了,这样统计就ok了。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll a[100005];
int main(){
	ll t,n,k,sum,maxx;
	scanf("%lld",&t);
	while(t--){
		scanf("%lld %lld",&n,&k);
		maxx = 0;
		for(int i = 1;i <= n;i++){
			scanf("%lld",&a[i]);		
		}
		sort(a + 1,a + 1 + n);
		maxx = a[n];
		sum = n;
		for(int i = n - 1;i >= 1;i--){
			if(maxx - a[i] > k){
				sum--;
			}else {
				maxx = a[i];
			}
		}
		printf("%lld\n",sum);
	}
	return 0;
} 




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值