• [AHOI 2016初中组]自行车比赛


    Description

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

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

    Input

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

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

    Output

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

    Sample Input

    3
    8
    10
    9

    Sample Output

    3

    Hint

    对于 20%的数据, 3<=N<=600。

    对于 50%的数据, 3<=N<=10000。

    对于 100%的数据, 3<=N<=300000 且 0<=B[i]<=2000000。

    题解

    先将所有人的分值从大到小排序,我们考虑钦定哪个人胜出,接着判断是否真的能够胜出。

    我们枚举胜出的人,显然做最好的考虑,为剩下的人加上分值的方案是,剔除这个选中的人后,从大到小为每个人加上从小到大的分值。

    由于存在着大量重复的操作,我们可以分别用前缀和后缀优化。

     1 //It is made by Awson on 2017.11.4
     2 #include <map>
     3 #include <set>
     4 #include <cmath>
     5 #include <ctime>
     6 #include <queue>
     7 #include <stack>
     8 #include <cstdio>
     9 #include <string>
    10 #include <vector>
    11 #include <cstdlib>
    12 #include <cstring>
    13 #include <iostream>
    14 #include <algorithm>
    15 #define LL long long
    16 #define Max(a, b) ((a) > (b) ? (a) : (b))
    17 #define Min(a, b) ((a) < (b) ? (a) : (b))
    18 #define Abs(a) ((a) < 0 ? (-(a)) : (a))
    19 using namespace std;
    20 const int N = 300000;
    21 
    22 int n, a[N+5], b[N+5];
    23 bool comp(const int &a, const int &b) {
    24     return a > b;
    25 }
    26 int maxl[N+5], maxr[N+5];
    27 
    28 void work() {
    29     scanf("%d", &n);
    30     for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
    31     sort(a+1, a+n+1, comp);
    32     for (int i = 1; i <= n; i++) b[i] = a[i], a[i] += i, maxl[i] = Max(maxl[i-1], a[i]);
    33     for (int i = n; i >= 1; i--) b[i] += i-1, maxr[i] = Max(maxr[i+1], b[i]);
    34     int ans = 0;
    35     for (int i = 1; i <= n; i++) if (Max(maxl[i-1], maxr[i+1]) <= b[i]-(i-1)+n) ans++;
    36     printf("%d
    ", ans);
    37 }
    38 int main() {
    39     work();
    40     return 0;
    41 }
  • 相关阅读:
    VS2010 创建 windows service 程序
    应用程序 调用 webservice
    管理随笔-组织无全面系统目标和规划
    笔记1——自写综保模块非语言实现方式
    测试模型V模型和W模型
    常用研发模型
    测试方法分类
    初识测试
    IntelliJ IDEA使用快捷键生成各种for循环。增强for循环等等
    java之jdbc数据库连接
  • 原文地址:https://www.cnblogs.com/NaVi-Awson/p/8052116.html
Copyright © 2020-2023  润新知