avatar

目录
题解 P6363 【软件工程实习】

一道能增强纠错能力的模拟题。

乍看之下很简单,其实这题的坑很多:

  1. 要强制类型转换的话,千万不能漏掉一个地方。(没错,就是这个让我调了几个小时)
  2. 一定要四舍五入,这里推荐 round() 函数。
  3. 一定要超过 $15$ 分才能删掉。
  4. 题目中团队之间互评得分按照每个组给每个组评分的顺序来的,不是第一行 A 团队的第二行 B 团队这样子的。

那么,讲一下主要思路吧:

首先,读入该读入的东西。一个字母的团队名可以转换成数字,这样子 A 团队就对应上了 1 号团队,以此类推。

然后,访问每一列,依次计算平均分。

最后,排序一下,输出。

完整代码见此

cpp
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){//第i个团
for(int j=1;j<=k;++j){
score[i][j]=read();
}
}
//计算队伍平均分
for(int i=1;i<=k;++i){//k teams
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);
//output
for(int i=1;i<=n;++i){
char c=stus[i].team+'A'-1;
cout<<stus[i].real<<" "<<c<<endl;
}
return 0;
}
文章作者: lianjiaming
文章链接: http://lianjiaming.github.io/2020/04/11/solution-P6363/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Jimmy_Lian的博客

评论