• P7072 直播获奖


    题目描述

    NOI2130 即将举行。为了增加观赏性,CCF 决定逐一评出每个选手的成绩,并直播即时的获奖分数线。本次竞赛的获奖率为 w%w\%w%,即当前排名前 w%w\%w% 的选手的最低成绩就是即时的分数线。

    更具体地,若当前已评出了 ppp 个选手的成绩,则当前计划获奖人数为 max⁡(1,⌊p∗w%⌋)max(1, lfloor p * w \% floor)max(1,pw%),其中 www 是获奖百分比,⌊x⌋lfloor x floorx⌋ 表示对 xxx 向下取整,max⁡(x,y)max(x,y)max(x,y) 表示 xxx 和 yyy 中较大的数。如有选手成绩相同,则所有成绩并列的选手都能获奖,因此实际获奖人数可能比计划中多。

    作为评测组的技术人员,请你帮 CCF 写一个直播程序。

    输入格式

    第一行有两个整数 n,wn, wn,w。分别代表选手总数与获奖率。
    第二行有 nnn 个整数,依次代表逐一评出的选手成绩。

    输出格式

    只有一行,包含 nnn 个非负整数,依次代表选手成绩逐一评出后,即时的获奖分数线。相邻两个整数间用一个空格分隔。

    输入输出样例

    输入 #1
    10 60
    200 300 400 500 600 600 0 300 200 100
    
    输出 #1
    200 300 400 400 400 500 400 400 300 300
    输入 #2
    10 30
    100 100 600 100 100 100 100 100 100 100
    输出 #2
    100 100 600 600 600 600 100 100 100 100

    说明/提示

    样例 1 解释


    数据规模与约定

    各测试点的 nnn 如下表:

    测试点编号n=n=n=
    1∼31 sim 313 101010
    4∼64 sim 646 500500500
    7∼107 sim 10710 200020002000
    11∼1711 sim 171117 10410^4104
    18∼2018 sim 201820 10510^5105

    对于所有测试点,每个选手的成绩均为不超过 600600600 的非负整数,获奖百分比 www 是一个正整数且 1≤w≤991 le w le 991w99。


    提示

    在计算计划获奖人数时,如用浮点类型的变量(如 C/C++ 中的 floatdouble,Pascal 中的 realdoubleextended 等)存储获奖比例 w%w\%w%,则计算 5×60%5 imes 60\%5×60% 时的结果可能为 3.0000013.0000013.000001,也可能为 2.9999992.9999992.999999,向下取整后的结果不确定。因此,建议仅使用整型变量,以计算出准确值。

    emmm.....可能小蒟蒻今天下午的脑子被吃掉了qwq

    扫橙经历:
    1.一个sort上去完美TLE

    2.想了想觉得数据范围太大了,所以改成了二分,结果发现二分好像也超时间复杂度了(好吧其实还有一些原因是我不太会写了(* ̄︶ ̄))

    3.又仔细想了想啊想了想啊,最后实在困得不行了,睡了5min

    4.觉得这不是个事儿啊,所以果断翻开题解

    5.....嗯....发现要用桐排....好啊,和我第一个想法一样(其实一开始想的是桶排而不是sort,但是不知道为什么当时的自己会觉得100000^2会比100000*600小。。。所以选择了sort放弃了桶排,所以果然是脑子被吃掉了吧....)

    主要思路:桶排记录每次的更新成绩,从高到低判断当前人数是否符合要求,符合就输出当前桐所代表的成绩

    50:sort代码

    #include<bits/stdc++.h>
    using namespace std;
    
    int n,w;
    int a[502000];
    
    bool cmp(int a,int b)
    {
        return a>b;
    }
    
    int main()
    {
        cin>>n>>w;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            sort(a+1,a+1+i,cmp);
            int p;
            if(w*i/100<=1) p=1;
            else p=w*i/100;
    //        cout<<p<<" : ";
            cout<<a[p]<<" ";
        }
        
        return 0;
    }

    100桶排代码:

    #include<bits/stdc++.h>
    using namespace std;
    
    int n,w;
    int a[602];
    
    int main()
    {
        cin>>n>>w;
        for(int i=1;i<=n;i++)
        {
            int b;
            cin>>b;
            a[b]++;
            int p=max(1,w*i/100);
            int num=0;
            for(int j=600;j>=0;j--)
            {
                if(a[j])
                {
                    num+=a[j];
                    if(num>=p) 
                    {
                        cout<<j<<" ";
                        break;
                    }
                }
            }
            
        }
        
        return 0;
    }

    经验总结:

    1.注意时间复杂度

    2.好好睡觉!!!!!

    -----------end-------------

  • 相关阅读:
    Android之动态图片
    Java之简单图形面积计算
    Java之姐妹素数
    Java之经典Student问题2
    数据库事务四大特性
    TCP/IP分层
    海量数据问题处理办法
    36个常见java面试题
    【19】【滑动窗口】【栽跟头】最长不重复子字符串
    一些面试题
  • 原文地址:https://www.cnblogs.com/yxr001002/p/14019492.html
Copyright © 2020-2023  润新知