1 条题解

  • 0
    @ 2024-3-2 17:25:55

    考虑这样一个问题:如果一个选手想要拿第一,那么最后一轮的分数肯定就是nn。所以,如果他的分数+n+n后大于了所有选手的分数,那么他就有可能获得第一名。

    那问题来了,其他选手的分数该怎么算呢?我们希望可能获得第一名的人数尽量多,换句话说就是平均分尽量低(这样选手的分数+n+n后可能超过的人数就更多),也就是最大值尽量小。

    那我们可以将之前将之前分数最高的选手分数+1+1,第二高的+2+2……第二个样例举例就是:

    • 15 +1=16
    • 15 +2=17
    • 14 +3=16
    • 12 +4=16
    • 12 +5=17

    最后求出这些数中的最大值,再遍历所有初始分数判断:如果它+n+n后大于最大值,说明它能大于所有分数,就有可能获得第一名。

    部分代码:

    sort(a+1,a+1+n); // 将初始分数排序
    for(ll i=1,k=n;i<=n;i++,k--)
        maxi=max(maxi,a[i]+k); // 加分并处理出最大值
    for(ll i=n;i>0;i--)
        if(a[i]+n>=maxi)
            ans++;
        else
            break;
    printf("%lld",ans);
    

    在遍历时有一些小技巧,我们从大到小遍历:如果此时的 aia_i 小于了 maximaxi,那么说明他不可能获得第一名;那么后面的比 aia_i 更小的数也不可能获得第一名,所以我们可以直接break退出循环。

    • 1

    [AHOI2016初中组] 自行车比赛

    信息

    ID
    678
    时间
    1000ms
    内存
    500MiB
    难度
    5
    标签
    递交数
    128
    已通过
    52
    上传者