【题解】自行车比赛 \([AHOI2016]\) \([P2777]\)

逼自己每天一道模拟题

传送门:自行车比赛 \([AHOI2016]\) \([P2777]\)

【题目描述】

比赛中一共有 \(N\) 位选手,每天第一名的选手会获得 \(N\) 点积分,第二名会获得 \(N-1\) 点积分,第三名会获得 \(N-2\) 点积分,依次类推,最后一名会获得 \(1\) 点积分。保证没有选手会排名相同。

在之前的数日较量中, \(N\) 位选手已经有了一些积分。现在即将开始的是最后一天的比赛。小雪想知道有多少位选手有可能获得最终的冠军,也就是说还有多少选手有可能通过最后一天的比赛获得累计总分第一名。

【输入】

第一行输入一个整数 \(N\),表示参赛选手总数。

之后 \(N\) 行,其中第 \(i\) 行输入一个整数 \(B[i]\) 表示第 \(i\) 位选手已经获得的累计积分。

【输出】

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

【样例 \(1\)】

样例输入:
3
8
10
9 样例输出:
3

【样例 \(2\)】

样例输入:
5
15
14
15
12
14 样例输出:
4

【数据范围】

\(100\%\) \(3 \leqslant N \leqslant 3e5\) \(,\) \(0 \leqslant b[i] \leqslant 2e6\)


【分析】

排个序先?

如果想让一个人获得冠军,那么最后一天让他拿最高分时,他得冠军的可能性是最大的,不妨设其为最高分,而其他人中基础分比他低的肯定抢不到冠军了,重点就是基础分比他高的看能不能抢到。

设最后一天基础分高的拿低分,低基础低的拿高分,然后看他们当中的最大值是否大于我们想要供为冠军的这个人的总分,如果大于则直接尝试供下一个,如果小于则 \(++ans\)。

来看看第二个样例:

排序后变成了酱紫:

假如要供第一个人,对应起来并计算总分:

发现第二个人总分比他高,跳过,供下一个人。如果想供第二个人,那么第一个随便给他什么分数都无所谓,而后面这三个人要尽量给小一点的分数即 \(1,2,3\),因此对应下来就是:

发现后面的逗比第二个人小,所以供奉成功。

以此类推,发现任意一人在供奉到他之前,始终都是那一个不改变的总分,于是可以用一个数组 \(f[\) \(]\) 来提前预处理出每个人后面的人的总分最大值,当要供奉某人 \(i\) 的时候直接用 \(f[i]\) 与 \(a[i]+n\) 比较一下大小并统计答案即可。

【Code】

#include<algorithm>
#include<cstdio>
#define Re register int
using namespace std;
const int N=3e5+3;
int n,ans,a[N],Q[N],f[N];
inline void in(Re &x){
int fu=0;x=0;char c=getchar();
while(c<'0'||c>'9')fu|=c=='-',c=getchar();
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
x=fu?-x:x;
}
int main(){
in(n);
for(Re i=1;i<=n;++i)in(a[i]);
sort(a+1,a+n+1);
for(Re i=n;i>=1;--i)Q[i]=a[i]+n-i+1;
f[n]=-1e9;
for(Re i=n-1;i>=1;--i)f[i]=max(f[i+1],Q[i+1]);
for(Re i=1;i<=n;++i)ans+=f[i]<=a[i]+n;
printf("%d",ans);
}

最新文章

  1. Javascript之自定义事件
  2. push方法的兼容性问题
  3. 将应用部署到Tomcat根目录的方法 去掉url里的项目名
  4. uploadify 自动访问url 初始化 自动请求
  5. 深度剖析C++对象池自动回收技术实现
  6. MySql 分组排序取时间最大的一条记录
  7. 对String的一点了解
  8. QTableView中嵌入复选框CheckBox 的四种方法总结
  9. Tensorflow 神经网络
  10. 滚动条加粗和panel,gridControl结合用
  11. 关于js的连续赋值
  12. SpringMVC文件上传下载
  13. tigervnc-server安装使用
  14. 字符编码-ASCII,GB2312,GBK,GB18030
  15. JSTL标签用法:&lt;c:choose&gt;&lt;c:forEach&gt;&lt;c:if&gt;&lt;c:when&gt;&lt;c:set&gt;
  16. MFC将二进制文件导入资源后释放
  17. CF475C. Kamal-ol-molk&#39;s Painting
  18. HTML和CSS实现常见的布局
  19. android学习九 对话框碎片
  20. Bzoj1486/洛谷P3199 最小圈(0/1分数规划+spfa)/(动态规划+结论)

热门文章

  1. 九度oj 题目1490:字符串链接
  2. fread了解一下
  3. iOS 设备推断 最新统计代码
  4. jQuery的DOM操作之捕获和设置
  5. 华为OJ2011-最长公共子串
  6. 新IOS编程语言 Swift 新编译器Xcode6
  7. JspSmartUpload 实现上传
  8. Android多媒体-MediaPlayer唤醒锁及音频焦点
  9. 2011:Audio Classification (Train/Test) Tasks - MIREX Wiki
  10. java 学习第一步---安装JDK以及配置环境变量