HDU 6095 思维题

来源:互联网 发布:mac n卡 hdmi音频输出 编辑:程序博客网 时间:2024/05/29 23:23

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 ith player’s strength point is ai.

If there is a match between the ith player plays and the jth 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
25 31 5 9 6 35 21 5 9 6 3
 

Sample Output
51
 

Source
2017 Multi-University Training Contest - Team 5
 
题意 : 输入两个值 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 longusing 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;} 




原创粉丝点击