Problem B: 评委打分
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 171 Solved: 27
[Submit][Status][Web Board]
Description
一个歌唱比赛,比赛每次会从观众中随即抽取几名观众给分(观众至少有5个,分数为0~10分),由于观众感情色彩较重,不能像评委那般全部作数,所以赛方想出去掉2个最高分与2个最低分,剩下的取平均值作为一名选手的分数(分数取整,四舍五入),赛方无暇来做这个程序,于是来找你帮忙。
Input
刚开始,输入T,表示有T名选手参赛,跟着一个数n,为抽取的n名评委,接下来n个数为各评委的评分。
Output
输出第几名选手的平均分,每两名选手间有空行间隔(最后一名后没有)。
Sample Input
2
5 0 10 5 4 4
7 5 4 6 2 3 0 3
Sample Output
Num 1:4
Num 2:3
解题思路:
1)数据采用结构体,用qsort函数进行从小到大排序,去掉前两个和后两个。
2)四舍五入:采用 int(num + 0.5)解决。
代码:
#include <iostream>
#include <cmath>
#include <stdlib.h>
using namespace std;
struct score
{
int s;
} SCORE[100];
int compare(const void *a, const void *b)
{
struct score *c = (score *)a;
struct score *d = (score *)b;
if (c->s > d->s)
return -1;
else
return 1;
}
int main()
{
int T;
int n;
int sum;
int flag = 0;
cin >> T;
int i;
for (i = 1; i <= T; ++i)
{
cin >> n;
sum = 0;
++flag;//选手
if (n >= 5)
{
int j;
for (j = 0; j < n; ++j)
{
cin >> SCORE[j].s;
}
qsort(SCORE, n, sizeof(SCORE[0]), compare);//stdlib.h 从大到小排序
// for (j = 0; j < n; ++j)
// {
// cout << SCORE[j].s << endl;
// }
for (j = 2; j < n-2; ++j)
{
sum += SCORE[j].s;
}
cout << "Num " << flag << ":" << int(sum / (1.0*(n-4)) + 0.5) << endl;
if (i != T)
cout << endl;
}
}
return 0;
}