感想
那么简单的这题,我当时居然写不出,只对了一半,原因是讲小数化为整数不够,
链接:登录—专业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;
}