P7072 直播获奖

题目描述

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

更具体地,若当前已评出了 ppp 个选手的成绩,则当前计划获奖人数为 max⁡(1,⌊p∗w%⌋)\max(1, \lfloor p * w \%\rfloor)max(1,pw%),其中 www 是获奖百分比,⌊x⌋\lfloor x \rfloorx⌋ 表示对 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 \times 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-------------

 

posted @ 2020-11-22 15:20  yxr~  阅读(337)  评论(0编辑  收藏  举报