学生互评作业的简单规则是这样定的:每个人的作业会被k
个同学评审,得到k
个成绩。系统需要去掉一个最高分和一个最低分,将剩下的分数取平均,就得到这个学生的最后成绩。本题就要求你编写这个互评系统的算分模块。
输入格式:
输入第一行给出3个正整数N
(3 < N
≤104,学生总数)、k
(3 ≤ k
≤ 10,每份作业的评审数)、M
(≤ 20,需要输出的学生数)。随后N
行,每行给出一份作业得到的k
个评审成绩(在区间[0, 100]内),其间以空格分隔。
输出格式:
按非递减顺序输出最后得分最高的M
个成绩,保留小数点后3位。分数间有1个空格,行首尾不得有多余空格。
输入样例:
6 5 3
88 90 85 99 60
67 60 80 76 70
90 93 96 99 99
78 65 77 70 72
88 88 88 88 88
55 55 55 55 55
输出样例:
87.667 88.000 96.000
我的代码(普通数组+sort排序):
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,k,m;
double ch[10005][15];
double sum[10005]={0};
double ave[10005];
cin>>n>>k>>m;
for(int i=0;i<n;i++)
{
for(int j=0;j<k;j++)
{
cin>>ch[i][j];
sum[i]+=ch[i][j];
}
sort(ch[i],ch[i]+k);
sum[i]=sum[i]-ch[i][0]-ch[i][k-1];
ave[i]=sum[i]/(double)(k-2);
}
sort(ave,ave+n);
for(int t=n-m;t<n;t++)
{
if(t==n-m) printf("%.3lf",ave[t]);
else printf(" %.3lf",ave[t]);
}
return 0;
}
原来的思路(set容器):
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,k,m,count=0;
double temp;
double tt;
cin>>n>>k>>m;
set<double>s[n];
set<double>f;
set<double>::iterator it;
for(int i=0;i<n;i++)
{
for(int j=0;j<k;j++)
{
cin>>temp;
s[i].insert(temp);
}
}
for(int i=0;i<n;i++)
{
it=s[i].begin();
s[i].erase(it);
it=s[i].end();
s[i].erase(it);
tt=accumulate(s[i].begin(), s[i].end(), 0.0) / s[i].size(); //去掉最大小值,计算set容器的均值,第一个参数首,第二个参数尾,0.0代表的第三个参数意味着加上第三个参数后的和
f.insert(tt);
}
for(it=f.begin();it!=f.end();it++)
{
count++;
if(count>=f.size()-n)
cout<<*it;
}
}
本来的思路是用set容器自动排序,然后删除首尾,计算均值,存到另一个容器,自动排序,根据条件输出。发现程序一运行到输入相同键值时就崩溃,后来发现set()不允许key值重复,但允许valve重复
在查阅csdn时发现有人跟我思路相同,但人家的思路更巧妙:(转载自:互评成绩_7-1 互评成绩 (30 分) 学生互评作业的简单规则是这样定的:每个人的作业会被k个同-优快云博客)
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3fffffff
int main()
{
int n,m,k; int i,j,p; int jb=1; set<double> s; set<double>::reverse_iterator it;
cin>>n>>k>>m;
for(p=0;p<n;p++)
{
double sum=0,mi=INF,ma=-INF,t;
for(i=0;i<k;i++)
{
cin>>t;
sum+=t;
if(t>ma) ma=t;
if(t<mi) mi=t;
}
sum=sum-ma-mi;
s.insert(sum/(k-2)+(double)p/1000000000);
}
it=s.rbegin();
for(i=0;i<m-1;i++)
it++;
printf("%.3lf",*it); it--;
for(;;it--)
{
jb++;
if(jb<=m)
{
printf(" %.3lf",*it);
}
else
break;
}
return 0;
}
另外,发现也有不少用vector()做的,道理与数组相同,不再介绍