代码源每日一题
题目描述
有nn个玩家参加比赛,他们分别有能力值a1,a2,…,ana1,a2,…,an。
需要进行n−1n−1轮比赛,每一轮在剩下的玩家里任选两个玩家i,ji,j。如果|ai−aj|>K|ai−aj|>K,那么其中能力值高的玩家会获胜,能力值低的玩家会被淘汰。如果|ai−aj|≤K|ai−aj|≤K,那么两个玩家都有可能获胜,另一个玩家被淘汰。
n−1n−1轮比赛之后,只剩下一个玩家。问有多少个玩家可能是最后获胜的玩家。
输入格式
第一行,两个整数n,Kn,K,表示玩家的总人数,和获胜条件中的参数。
接下来一行nn个整数a1,a2,…,ana1,a2,…,an,表示玩家的能力值。
输出格式
一个整数,表示最后可能获胜的玩家个数。
样例输入1
5 3
1 5 9 6 3
样例输出1
5
样例输入输出2
见下发文件。
数据规模
共10组数据。
测试点11满足n≤5n≤5。
测试点22满足n≤10n≤10。
测试点3,4,53,4,5满足n≤1000n≤1000。
对于100%100%的数据,满足n≤105,1≤ai,K≤109
思路:这个题问有多少种可能,我们可以求出必败态的人,也就是差值太大的人,求必败态也就是求不可能的人数。(当题目问有多少种可能,我们可以反过来求不能,“正难则反”),总数减去不可能即可。必胜的必定是最大的,往后遍历看是否出现断层,如:1 1 1 1 9,k为3,那么只有9才行。
完整代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7;
const int N=1e5+10;
int a[N];
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+1+n);
int ans=1;
for(int i=n;i>=2;i--)
{
if(a[i]-a[i-1]<=k)
{
ans++;
}
else
{
break;
}
}
cout<<ans<<endl;
return 0;
}