牛客挑战赛72 Crying 与选秀

描述了一个关于选秀节目的问题,需计算选手得分后进入前666名的人数及淘汰情况,涉及C++编程和实时排名更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

感想

那么简单的这题,我当时居然写不出,只对了一半,原因是讲小数化为整数不够,

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

Crying 正在观看一档选秀节目。

这档节目一共有 nnn 个选手,编号为 1,2,…,n1, 2, \dots, n1,2,…,n,他们依次出场并获得评分。每个人的评分是在 [90,100][90, 100][90,100] 内的一个 777 位小数,保证没有两个人的评分是相等的。

这档节目最后只能晋级分数最高的 666 个人,所以当每个人获得评分之后需要展示当前分数前 666 名的变化。

为了节目效果,节目需要知道有多少个人满足在自己获得评分之后进入当前时刻的前 666 名,以及每个进入前 666 名的人淘汰了其中的哪个人(也有可能没有淘汰别人)。

需要注意到,如果一个人在某个时刻被从前 666 名淘汰出来,那么 TA 显然不可能在之后重返前 666 名。

输入描述:

 

第一行,一个正整数 nnn。

第二行,nnn 个 [90,100][90, 100][90,100] 中的 777 位小数 a1,a2,…,ana_1, a_2, \dots, a_na1​,a2​,…,an​,依次表示每个人的分数。

对于所有数据,1≤n≤1051 \le n \le 10^51≤n≤105,90≤ai≤10090 \le a_i \le 10090≤ai​≤100,aia_iai​ 恰有 777 位小数(末尾可能有 000)且互不相同。

输出描述:

 

第一行,一个非负整数,表示满足在自己获得评分之后进入当前时刻的前 666 名的人数。

第二行,nnn 个非负整数 p1,p2,…,pnp_1, p_2, \dots, p_np1​,p2​,…,pn​。若 iii 获得评分之后没有进入前 666 名或进入之后没有淘汰别人,则 pi=0p_i=0pi​=0;否则 pip_ipi​ 表示 iii 进入前 666 名之后淘汰了 pip_ipi​。

示例1

输入

复制7 90.0000000 90.1111111 90.2222222 90.3333333 90.4444444 90.5555555 90.6666666

7
90.0000000 90.1111111 90.2222222 90.3333333 90.4444444 90.5555555 90.6666666

输出

复制7 0 0 0 0 0 0 1

7
0 0 0 0 0 0 1

说明

 

每个人获得评分之后都是当前所有人中评分最高的,因此每个人都能进入当前时刻的前 666 名。

第 666 个人获得评分之后前 666 名分别是第 6,5,4,3,2,16, 5, 4, 3, 2, 16,5,4,3,2,1 个人,而第 777 个人获得评分之后前 666 名分别是第 7,6,5,4,3,27, 6, 5, 4, 3, 27,6,5,4,3,2 个人,其中第 111 个人被挤了出去。

示例2

输入

复制7 91.1234567 91.9260817 99.8244353 90.0000000 92.0114514 93.1919810 98.7654321

7
91.1234567 91.9260817 99.8244353 90.0000000 92.0114514 93.1919810 98.7654321

输出

复制7 0 0 0 0 0 0 4

7
0 0 0 0 0 0 4

AC代码:

#include<iostream>
#include<set>
#include<map>
using namespace std;
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    set<long long>se;
    long long n,a[100200],ans[100200],an=0;
    map<long long,long long >p;
     double x;
    set<long long>::iterator it;
    cin>>n; 
    for(long long  i=1;i<=n;i++)
    {
        cin>>x;
        a[i]=x*10000000000;//就这里,我少打了0
        p[a[i]]=i;
        if(se.size()<6)
        {
            se.insert(a[i]);
            an++;
            ans[i]=0;
        }
        else
        {
            if(a[i]>*se.begin())
            {
                ans[i]=p[*se.begin()];
                an++;
                se.erase(se.begin());
                se.insert(a[i]);
            }
            else ans[i]=0;
        }
    }
    cout<<an<<"\n";
    for(long long  i=1;i<=n;i++) cout<<ans[i]<<" ";
    cout<<endl;
    

        return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值