形象大使选拔赛[2022希望杯兴趣组T2] 题面
题目描述
城市形象大使选拔赛将要开始啦,初赛时组委会对 n 名选手的综合素质进行了打分, 每名选手都想知道有多少人比自己分数高,组委会想知道前 5 名选手的编号及平均分, 现在请你编程完成以上功能。
输入格式
第一行,一个整数 n,代表选手人数。
第二行,n 个整数 xi,用空格分隔,第 i 个整数代表编号为 i 的选手的分数。
输出格式
第一行,有 n 个整数,以一个空格分隔,在这些数中,第 i 个数代表所有分数高于第 i 人分数的选手人数。
第二行,按分数从高到低输出前 5 名的选手编号,以一个空格分隔,若分数相同, 先输出小的编号。
第三行,一个数(四舍五入,保留 2 位小数),代表前 5 名选手的平均分。
样例
输入 #1
7 6 5 8 6 7 8 6
输出 #1
3 6 0 3 2 0 3 3 6 5 1 4 7.00
数据范围:
5≤n≤1000
0≤xi≤10
讲解
这道题我们可以开一个结构体表示选手的分数、编号和比他大的人数。
接着我们进行排序,进行排序后我们找一下比他大的人数,比他大的人数就是排名减去和他一样的人数。
然后我们来一个双重循环:
外层循环表示序号,内层循环搜索序号,搜索到了之后就break;
并且,我们将前五个循环一次输出序号并记住总和。
最后输出平均数^_^
正解
话不多说,直接上代码ヾ(≧▽≦*)o
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
#include <stack>
#include <vector>
#include <set>
#include <cstdio>
#include <cmath>
using namespace std;
struct xuanba{
int p; //得分
int id;//序号
int m; //比他大的人数
};
xuanba a[1002];
int n;
int cmp(xuanba a,xuanba b){
if(a.p==b.p){
return a.id<b.id;
}
return a.p>b.p;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].p;
a[i].id=i;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
int x=1;
while(i>=1&&a[i-x].p==a[i].p){
x++;
}
a[i].m=i-x;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(a[j].id==i){
cout<<a[j].m<<" ";
break;
}
}
}
cout<<endl;
double sum=0;
for(int i=1;i<=5;i++){
sum+=a[i].p;
cout<<a[i].id<<" ";
}
cout<<endl<<fixed<<setprecision(2)<<sum/5;
return 0;
}