[#4练习赛]成绩统计
题目描述
传智专修学院的“Java程序设计”班有 N ( 1 ≤ 100 ) N(1 \le 100) N(1≤100) 个学生,知道他们的个人信息和成绩:
- 姓名(长度不超过 20 20 20 的仅由小写字母组成的字符串)
- 平时分成绩( 0 0 0 到 100 100 100 的整数)
- 期末考试成绩( 0 0 0 到 100 100 100 的整数)
由于期末考试有点难,为了让分数没那么难看,将期末考试成绩进行调分,调分后的期末成绩是将其开根号(sqrt)后乘 10 10 10,然后向上取整。
最后这个同学的总评得分是 60% 的调分后期末考试成绩,加上 40% 的平时分成绩,四舍五入精确到整数。
请对这些同学的成绩进行排名。
输入格式
第一行一个整数 N N N。
接下来 N N N 行,每行包括一个字符串,和两个整数,用空格隔开,分表代表这个同学的姓名,平时分和期末考试成绩。
输出格式
从高到低输出对应同学的姓名。如果两个同学的得分相同,原来输入顺序靠前的,输出时也应当靠前。
样例 #1
样例输入 #1
4
a 60 36
b 70 49
c 50 25
d 60 36
样例输出 #1
b 70
a 60
d 60
c 50
题解
#include<stdio.h>
#include<math.h>
#include<string.h>
typedef struct finalScore{
char name[21];
int score;
}finalScore;
void insert_sort(finalScore *num,int len){
for(int i=0;i<len;i++){
finalScore tmp = num[i];
int j = i;
while(j > 0 && num[j-1].score < tmp.score){
num[j] = num[j-1];
j--;
}
num[j] = tmp;
}
}
int main(){
int n;
char name[21];
int final,usual;
scanf("%d",&n);
finalScore f[110];
for(int i=0;i<n;i++){
scanf("%s %d %d",&name,&usual,&final);
strcpy(f[i].name,name);
int score = (int)(ceil(sqrt(final)*10)*0.6 + 0.4*usual + 0.5);
f[i].score = score;
}
insert_sort(f,n);
for(int i=0;i<n;i++){
printf("%s %d",f[i].name,f[i].score);
if(i!=n-1){
printf("\n");
}
}
return 0;
}