• 洛谷 P2777 [AHOI2016初中组]自行车比赛


    题目描述

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

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

    输入输出格式

    输入格式:

     

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

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

     

    输出格式:

     

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

     

    输入输出样例

    输入样例#1:
    3
    8
    10
    9
    输出样例#1:
    3
    输入样例#2:
    5
    15
    14
    15
    12
    14
    输出样例#2:
    4

    说明

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

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

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

    题目大意:每个人有一些分数,然后进行一次比赛,最后一名得分1,第一名得分n,问有几个人可以成为第一名。

    题解:将分数从小到大排序,如果当前的分数大于等于最高分数+1,那么后面的分数加上n肯定比最高分数加1大。

    直接输出return 0;

    坑点:别信样例

    代码:

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int n,a[300005];
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%d",a+i);
        sort(a+1,a+n+1);
        for(int i=1;i<=n;i++){
            if(a[i]+n>a[n]){
                printf("%d
    ",n-i+1);
                return 0;
            }
        }
        printf("0
    ");
        return 0;
    }
  • 相关阅读:
    Json,Gson,FastJson解析笔记
    Java 里把 InputStream 转换成 String 的几种方法
    11大Java开源中文分词器的使用方法和分词效果对比,当前几个主要的Lucene中文分词器的比较
    HDU 1599 find the mincost route
    如何更改Java括号中的默认对齐
    Android Java 与 C++ 恒调用,路径、文件名、延长的最大长度
    使用android SpannableStringBuilder实现图文混排,看到许多其他
    POJ 2352 Stars 树阵
    cocos2dx环境配置和打包
    DSR on Openstack POC
  • 原文地址:https://www.cnblogs.com/zzyh/p/7600759.html
Copyright © 2020-2023  润新知