大奖赛现场统分

试题描述

   已知某大奖赛有n个选手参赛,m(m > 2)个评委为参赛选手评分(最高10分,最低0分)。统分规则为:在每个选手的m个得分中,去掉一个最高分和一个最低分后,取平均分作为该选手的最后得分。要求编程实现: 
   (1)根据n个选手的最后得分,从高到低输出选手的得分名次表,以确定获奖名单。 
   (2)根据各选手的最后得分与各评委给该选手所评分数的差距,对每个评委评分的准确性和评分水准给出一个定量的评价,从高到低输出各评委得分的名次表。 
   评委得分 = (score[i]为该评委给第i个选手的评分,s[i]为第i个选手的最后得分)

输入

   输入包含2 * n + 1行: 
   第一行是选手个数n和评委个数m(1 < n <= 40,2 < m <= 20)。 
   第二行是第1个选手的编号(int范围整数)。 
   第三行是m个评委依次对第1个选手给出的评分(float范围浮点数),每行m个评分,相邻两项之间用一个空格隔开。 
   …… 
   第2 * n行是第n个选手的编号(int范围整数)。 
   第2 * n + 1行是m个评委依次对第n个选手给出的评分(float范围浮点数),每行m个评分,相邻两项之间用一个空格隔开。

输出

   输出n + m行: 
   第一行到第n行是选手的得分名次表,每行均有三项(排名、得分、选手编号),相邻两项之间用一个空格隔开,得分输出要求小数点后必须保留3位有效数字(四舍五入),不足补零。 
   第n + 1行到第n + m行是评委的得分名次表,每行均有三项(排名、得分、评委编号),相邻两项之间用一个空格隔开,得分输出要求小数点后必须保留3位有效数字(四舍五入),不足补零。

输入示例

   4 5 
   11 
   8.9 9.6 9.7 9.4 9 
   12 
   7.9 9.2 9.2 9.3 8.9 
   13 
   9.1 9.7 9.7 9.8 9.4 
   14 
   8.1 8.8 8.7 9.0 8.6

输出示例

   1 9.600 13 
   2 9.333 11 
   3 9.100 12 
   4 8.700 14 
   1 9.841 2 
   2 9.804 3 
   3 9.791 4 
   4 9.776 5 
   5 9.252 1

数据范围

   输入输出均为int范围的整数和float范围的浮点数

参考代码(qsort)

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
struct megagame
{
	float score;
	int index;
	float num[21];
}op[41],ra[21];

int cmp(const void *a,const void *b)
{
	megagame A=*(megagame*)a;
	megagame B=*(megagame*)b;
	return A.score>B.score?-1:1;
}

int main()
{
	int n,m;
	float max,min;
	float temp=0;
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&op[i].index);
		for(int j=0;j<m;j++)
			scanf("%f",&op[i].num[j]);
	}
	for(int i=0;i<n;i++)
	{
		max=min=op[i].num[0];
		for(int j=0;j<m;j++)
		{
			if(op[i].num[j]>max)
				max=op[i].num[j];
			if(op[i].num[j]<min)
				min=op[i].num[j];
		}
		op[i].score=0;
		for(int j=0;j<m;j++)
				op[i].score+=(op[i].num[j]);
		op[i].score-=(min+max);
		(op[i].score)/=(m-2);
	}
	for(int j=0;j<m;j++)
	{
		temp=0;
		for(int i=0;i<n;i++)
			temp+=((op[i].num[j]-op[i].score)*(op[i].num[j]-op[i].score));
		ra[j].score=10.0-sqrt(temp/n);
		ra[j].index=j;
	}
	qsort(op,n,sizeof(op[0]),cmp);
	qsort(ra,m,sizeof(ra[0]),cmp);
	for(int i=0;i<n;i++)
		printf("%d %.3f %d\n",i+1,op[i].score,op[i].index);
	for(int i=0;i<m;i++)
		printf("%d %.3f %d\n",i+1,ra[i].score,ra[i].index+1);
	return 0;
}Code language: PHP (php)
 如未特殊声明,文章均为原创。
 本文标题:大奖赛现场统分
 本文链接:https://manwish.cn/article/%e5%a4%a7%e5%a5%96%e8%b5%9b%e7%8e%b0%e5%9c%ba%e7%bb%9f%e5%88%86.html

留下评论