一道能增强纠错能力的模拟题。
乍看之下很简单,其实这题的坑很多:
- 要强制类型转换的话,千万不能漏掉一个地方。(没错,就是这个让我调了几个小时)
- 一定要四舍五入,这里推荐
round()
函数。
- 一定要超过 $15$ 分才能删掉。
- 题目中团队之间互评得分按照每个组给每个组评分的顺序来的,不是第一行 A 团队的第二行 B 团队这样子的。
那么,讲一下主要思路吧:
首先,读入该读入的东西。一个字母的团队名可以转换成数字,这样子 A 团队就对应上了 1 号团队,以此类推。
然后,访问每一列,依次计算平均分。
最后,排序一下,输出。
完整代码见此
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| struct stu{ int team; int lilun; double real; }stus[1050];
bool cmp(stu a,stu b){ if(a.real!=b.real) return a.real>b.real; return a.team<b.team; }
int n,k; double score_of_team[30]; int score[30][30];
int main(){ n=read(),k=read(); for(int i=1;i<=n;++i){ int s=read();char t; cin>>t; stus[i].lilun=s; stus[i].team=t-'A'+1; }
for(int i=1;i<=k;++i){ for(int j=1;j<=k;++j){ score[i][j]=read(); } } for(int i=1;i<=k;++i){ double sum=0; for(int j=1;j<=k;++j){ sum+=score[j][i]; } double average=sum/k; int shiji=k; for(int j=1;j<=k;++j){ if(abs(score[j][i]-average)>15){ shiji--;sum-=score[j][i]; } double nowaverage=sum/shiji*1.0; score_of_team[i]=(int)round(nowaverage); } }
for(int i=1;i<=n;++i){ stus[i].real=(int)round(0.6*stus[i].lilun+0.4*score_of_team[stus[i].team]); } sort(stus+1,stus+n+1,cmp); for(int i=1;i<=n;++i){ char c=stus[i].team+'A'-1; cout<<stus[i].real<<" "<<c<<endl; } return 0; }
|