您的位置:首页 > 其它

自行车比赛(AHOI2016初中组T1)

2016-12-31 07:41 183 查看
【题目描述】

小雪非常关注自行车比赛,尤其是环滨湖自行车赛。一年一度的环滨湖自行车赛,需要选手们连续比赛数日,最终按照累计得分决出冠军。今年一共有 N 位参赛选手。每一天的比赛总会决出当日的排名,第一名的选手会获得 N 点得分,第二名会获得 N-1 点得分,第三名会获得 N-2 点得分,依次类推,最后一名会获得 1 点得分。保证没有选手会排名相同。

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

【输入格式】

第一行输入一个整数 N,表示参赛选手总数,保证 3<=N<=300000。

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

【输出格式】

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

【样例输入】

3

8

10

9

【样例输出】

3

【数据范围】

3<=N<=300000 且 0<=B[i]<=2000000。

【分析】

单调队列模拟下就好。

var
i,n,p,q:longint;
a:array[0..300001]of longint;
procedure qsort(l,r:longint);
var
i,j,mid,tmp:longint;
begin
i:=l;j:=r;
mid:=a[(l+r) div 2];
repeat
while a[i]<mid do inc(i);
while a[j]>mid do dec(j);
if i<=j then
begin
tmp:=a[i];a[i]:=a[j];a[j]:=tmp;
inc(i);dec(j);
end;
until i>j;
if l<j then qsort(l,j);
if i<r then qsort(i,r);
end;
begin
readln(n);
for i:=1 to n do readln(a[i]);
qsort(1,n);
a[0]:=maxlongint;
q:=n;
for p:=1 to n-1 do
begin
while a[q]+n-q+1<=a[p]+n do dec(q);
if q<p then break;
end;
write(n-p+1);
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: