7-2互评成绩
PTA題 7-2互評成績
- 題目要求
- 輸入格式
- 輸出格式
- 輸入樣例
- 輸出樣例
- 代碼以及解釋
- 通過
題目要求
學生互評作業的簡單規則是這樣定的:每個人的作業會被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代碼以及解釋
#include <iostream> #include<bits/stdc++.h> using namespace std; //快排 int get_mid(double b[],int left,int right) //注意double數組 {double pivot=b[left]; //同樣要定義double類型的pivot存儲數據while(left<right){while(b[right]>=pivot&&left<right) right--;b[left]=b[right];while(b[left]<=pivot&&left<right) left++;b[right]=b[left];}b[left]=pivot;return left; } void sqsort(double b[],int left,int right) {if(left<right){int mid=get_mid(b,left,right);sqsort(b,left,mid-1);sqsort(b,mid+1,right);}}int main() {int n,k,m;cin>>n>>k>>m; double num_suanfen[11];//用來算出一個同學的分數double people_fenshu[10000];//存儲每個人的分數,//例如1同學分數為100:people_fenshu[1]=100;double number; //暫時存儲某一個同學的分數,用來做計算的中間變量double max1,min1;//一個同學的成績的最大值最小值for(int i=1;i<=n;i++) //輸入數據{number=0.00; //每次收入一個同學的成績,number都要置零int j=1;while(cin>>num_suanfen[j]) //存入一個同學的成績,注意while結束的條件 {j++;if(j>k)break;}max1=num_suanfen[1];//置初值min1=num_suanfen[1];for(int ii=1;ii<=k;ii++) //去掉最高分和最低分算出成績{if(num_suanfen[ii]>max1) max1=num_suanfen[ii];if(num_suanfen[ii]<min1) min1=num_suanfen[ii];number+=num_suanfen[ii];}number=number-max1-min1;people_fenshu[i]=number/(k-2);}sqsort(people_fenshu,1,n); //由高到低排序int flag=1; //做標志,來滿足“行首尾不得有多余空格”,判斷是不是第一個數for(int y=n-m+1;y<=n;y++){ if(flag==1){printf("%.3f",people_fenshu[y]); //是第一個數,輸出該數flag++;//此時只要讓flag不滿足if條件就行}else //不是第一個數,輸出空格和數字printf(" %.3f",people_fenshu[y]);}return 0; //main函數結束 }??我是用的是快排,剛學,參考課本,需要注意的是因為要計算出來小數點后面數,所以有些地方用double類型(注釋有寫)。
??思路是先計算出來每名學生的成績(去掉了最高分和最低分之后的平均成績),然后把這些同學的成績進行非遞減排序(如題意),然后輸出后面m名同學的成績。
通過
總結
- 上一篇: 分享15款为jQuery Mobile定
- 下一篇: git操作提示warning: redi