Vijos P1988 自行车比赛

因为听说是doc出题就看了下,T1T3不会,T4不想打,T2考完才发现sort反了QAQ,感觉没救了。

描述

小雪非常关注自行车比赛,尤其是环滨湖自行车赛。一年一度的环滨湖自行车赛,需要选手们连续比赛数日,最终按照累计得分决出冠军。今年一共有N位参赛选手。每一天的比赛总会决出当日的排名,第一名的选手会获得N点得分,第二名会获得N-1点得分,第三名会获得N-2点得分,依次类推,最后一名会获得1点得分。保证没有选手会排名相同。
在之前的数日较量中,N位选手已经分别累计了一些分数。现在即将开始的是最后一天的比赛。小雪希望知道有多少位选手还有可能获得最终的冠军,也就是说还有多少选手有可能通过最后一天的比赛获得累计总分第一名。

输入格式

第一行输入一个整数N,表示参赛选手总数,保证3<=N<=300000。
之后N行,其中第i行输入一个整数B[i]表示第i位选手已经获得的累计分数,满足0<=B[i]<=2000000。

输出格式

输出只有一行,只输出一个整数,表示有多少位选手有可能获得最终的冠军。

样例

样例一
    输入
        3
        10
        9
        8
    输出
        3
样例二
    输入
        5
        15
        14
        15
        12
        14
    输出
        4

限制

对于20%的数据,3<=N<=600。
对于50%的数据,3<=N<=10000。
对于100%的数据,3<=N<=300000且0<=B[i]<=2000000。
对得分排一边序后,我们发现,判断当前第i个人是否可能,一定是第i个人得到了n分,原本得分最多的人得到了1分,第二多的得到了2分……由题意得,最初的得分是没有重复的,也就是排序后,总有num[i] - num[i-1] >= 1 , 因为在经过一轮比赛后,得分第j多的人,会比第j-1多的人少得1分,但最多就是num[j] - num[j-1] == 0 ,不会出现原本num[j] - num[j-1] >= 1,之后num[j] - num[j-1] < 0的情况,也就是说,经过一轮的加分后,除了当前要判断的第i人以外,其他人中的最高分是原本最高分+1,只需要对第i人与最高分+1得分比较即可,这样复杂度便只有快排是O(nlogn),对于每个人的验证都是O(1)的,总复杂度为O(nlogn)。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
int num[1000010];
int main()
{
    scanf("%d",&n);
    for(int i = 1 ; i <= n ; i ++)
        scanf("%d",&num[i]);
    sort(num+1,num+n+1);
    int ans = 1;
    for(int i = 1 ; i < n ; i ++)
        if(num[i] + n >= num[n] + 1)
            ans ++;
    printf("%d\n",ans);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值