题目:
有m个选手n个评委,每个评委给所有选手打分。最后得分的计算规则为去掉一个最高分,去掉一个最低分后取平均分为最后得分。要求按得分从高到低排出名次,公布获奖名单。本题要求用行指针实现。1≤m,n≤10。请务必用冒泡排序。
输入格式:
输入共m+1行,第一行是m和n两个整数,其他行是m×n个整数。
输出格式:
输出一行,表示选手编号的一种排列(用%3d格式),这种排列代表得分从高到低的选手顺序。
输入样例:
8 5
7 8 9 7 8
8 9 7 9 8
8 9 8 8 7
8 9 9 9 8
7 6 8 9 7
6 7 8 9 9
6 7 8 7 8
7 8 7 6 7
输出样例:
4 2 3 6 1 5 7 8
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
解答
#include<stdio.h>
double sort(int *str_p,int n);
int main(void)
{
int m,n;
scanf("%d %d",&m,&n);
int str[m][n],arr_x[m];
double arr[m];
int (*str_p)[n]=str;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
scanf("%d",&str[i][j]);
}
}
for(int i=0;i<m;i++)
{
arr[i]=sort(str_p[i],n);
}
//pai xu ping jun fen
for(int i=0;i<m;i++)
{
int max_j=0;
for(int j=0;j<m;j++)
{
if(arr[max_j]<arr[j])
{
max_j=j;
}
}
arr_x[i]=max_j;
arr[max_j]=-1;
}
//
for(int i=0;i<m;i++)
{
printf("%3d",arr_x[i]+1);
}
return 0;
}
//sort
double sort(int *str_p,int n)
{
int temp,sum=0;
double average;
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-1;j++)
{
if(*(str_p+j)>*(str_p+j+1))
{
temp=*(str_p+j);
*(str_p+j)=*(str_p+j+1);
*(str_p+j+1)=temp;
}
}
}
for(int i=1;i<n;i++)
{
sum+=*(str_p+i);
}
average=1.0*sum/(n-2);
return average;
}