1 条题解
-
0
考虑这样一个问题:如果一个选手想要拿第一,那么最后一轮的分数肯定就是。所以,如果他的分数后大于了所有选手的分数,那么他就有可能获得第一名。
那问题来了,其他选手的分数该怎么算呢?我们希望可能获得第一名的人数尽量多,换句话说就是平均分尽量低(这样选手的分数后可能超过的人数就更多),也就是最大值尽量小。
那我们可以将之前将之前分数最高的选手分数,第二高的……第二个样例举例就是:
- 15 +1=16
- 15 +2=17
- 14 +3=16
- 12 +4=16
- 12 +5=17
最后求出这些数中的最大值,再遍历所有初始分数判断:如果它后大于最大值,说明它能大于所有分数,就有可能获得第一名。
部分代码:
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);
在遍历时有一些小技巧,我们从大到小遍历:如果此时的 小于了 ,那么说明他不可能获得第一名;那么后面的比 更小的数也不可能获得第一名,所以我们可以直接
break
退出循环。
- 1
信息
- ID
- 678
- 时间
- 1000ms
- 内存
- 500MiB
- 难度
- 5
- 标签
- 递交数
- 128
- 已通过
- 52
- 上传者