题目描述
红太阳杯遥控飞机大赛拉开帷幕。比赛规则为,每位选手让自己的飞机从起点到终点飞行5次,组委会记录5次的飞行的成绩之后去掉一个最大成绩、一个最小成绩后计算剩余3个成绩的平值(平均分保留3位小数)作为该选手的最终成绩。 有n名选手参加了比赛,从键盘读入每位选手的编号以及他们的5次飞行的成绩。 请根据n名选手的比赛成绩,编程计算出冠军、亚军、季军的编号以及组委会计算出的成绩。(假设不存在多名选手成绩正好一样)(4.1.51)
输入输出格式
输入
第一行为一个整数n,代表参加比赛的选手数量(n>=4 && n<=100) 后面的n行,每行有6个数,第一个数是选手的编号,后5个数为选手的5次飞行的成绩 输出
输出
3行,第一行输出冠军的编号及飞行成绩(保留3位小数)用空格隔开2个数;第二行输出亚军的编号及飞行成绩,第三行输出季军的编号及飞行成绩
输入输出样例
样例
输入1
4
11 58 59 60 61 62
18 59 60 61 62 63
23 65 64 63 62 62
10 60 61 61 65 62
Copy
输出1
23 63.000
10 61.333
18 61.000
Copy
时间及空间限制
1s, 256MB.
#include<bits/stdc++.h>
using namespace std;
struct player
{
int num;
double t_score;
bool operator <(const player &a)const
{
if(t_score<a.t_score) return true;
else return false;
}
}p[105];
priority_queue<player>q;
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>p[i].num; //记录编号
int sum=0;
int max_=0,min_=100; // 最高分、最低分
for(int j=1;j<=5;j++)
{
int temp;
cin>>temp;
sum+=temp; //5个分数累加
if(max_<temp)
{
max_=temp;
} //找到最高分
if(min_>temp)
{
min_=temp;
} //找到最低分
}
p[i].t_score=(sum-max_-min_)/3.0; //记录最终得分
q.push(p[i]); //把选手结点放入优先队列,自动按照t_score降序排列
}
for(int i=0;i<3;i++)
{
player p_temp;
p_temp = q.top();
q.pop();
cout<<p_temp.num<<" "<<fixed<<setprecision(3)<<p_temp.t_score<<endl;
}
return 0;
}