互评成绩
7-41 互評成績
學生互評作業的簡單規則是這樣定的:每個人的作業會被k個同學評審,得到k個成績。系統需要去掉一個最高分和一個最低分,將剩下的分數取平均,就得到這個學生的最后成績。本題就要求你編寫這個互評系統的算分模塊。
輸入格式:
輸入第一行給出3個正整數N(3 < N ≤10?4??,學生總數)、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?用一維數組存放k個成績,進行排序,排序后去掉最高分最低分,求和,求得的和用一維數組sum存放,輸出后m個成績
#include<bits/stdc++.h> using namespace std;int main() {int n,k,m;cin>>n>>k>>m;int grade[k];//暫存當時的學生的k個成績 double sum[n];//sum存放學生總成績 for(int i=0;i<n;++i){for(int j=0;j<k;++j){cin>>grade[j]; }sort(grade,grade+k);//對K個成績進行排序 sum[i]=0;for(int j=1;j<k-1;++j)//去掉最高分grade[k-1]和最低分grade[0]{sum[i]+=grade[j];}} int flag=0;sort(sum,sum+n);//對每個人的總成績從小到大排列 for(int i=n-m;i<n;++i)//輸出后m個數 {if(flag)cout<<" ";printf("%.3f",sum[i]*1.0/(k-2));flag=1;}return 0; }那下面這一版又是怎么回事呢,哎,對了,就是鐵憨憨我第一次自己想的辦法,也沒多麻煩,就是把每個對應的同學的成績記錄到自己的那一行;其實,對于這道題來說,沒必要,真的沒必要;需要值和編號對應的題目請看這個鏈接:
?
這就是我一開始的思路啦:
可以用二維數組存放各位同學各個成績和一個存放總成績的一維數組,再加上排序函數sort解決
sort函數默認從小到大排序;
#include<bits/stdc++.h> using namespace std;int main() {int n,k,m;int stu[10010][20];scanf("%d %d %d",&n,&k,&m);int sum[10010];memset(sum,0,sizeof(sum));for(int i=0;i<n;++i){int j;for(j=0;j<k;++j){int x;scanf("%d",&x);stu[i][j]=x;}//sort函數默認從小到大排序 sort(stu[i],stu[i]+k);//對第i名同學的成績排序 for(int p=1;p<k-1;++p)//去掉最高分和最低分后求和 {sum[i]+=stu[i][p];}}sort(sum,sum+n);//對所有同學的總分排序 int flag=0;for(int i=n-m;i<n;++i) //輸出后m個同學的成績 {if(flag)printf(" ");double y=sum[i]*1.0/(k-2);printf("%.3f",y);flag=1;} return 0; }?
?
?
?
?
?
總結
- 上一篇: poj 2955 区间dp
- 下一篇: 与你相关|《个人信息保护法》发布后我们能