全国高校程序设计大赛 评定奖学金
题目描述
评定奖学金。 奖学金评比方法如下:先计算加权成绩,其中k为课程数,
然后按照加权成绩排序(规定所有同学的加权成绩各不相同),根据学生的数量取前10%的同学获得一等奖学金(获奖人数向上取整),输出一等奖学金的学生姓名。
按照下面的顺序输入相关信息:
(1) 输入课程数k (k<10) ;
(2) 依次输入k个数据表示ki ]课程所对应的学分;
(3) 输入学生数量N(N<100);
(4) 从第四行开始依次输入N个学生的信息(信息格式:姓名及对应的各i ]课的成绩)。
输入说明:
第一行输入整数k;
第二行依次输入k个数据;
第三行输入一个整数N;
从第四行开始依次输入N名同学的成绩数据
(数据格式:姓名K门课的整数成绩)输出说明:输出获一等奖的学生姓名,有多名同学则用单个空格隔
开。输入样例:5 2.0 1.0 2.0 3.0 0.5 5 XM 75 90 80 80 90 ZB 65 80 70 70 85 XH 70 80 70 75 90 WJ 80 85 85 85 90 LH 80 90 90 80 85
输出样例:WJ
代码提交说明
代码提交说明:
1.请严格按照每道题目给出的输入/输出样例编写相关I/O代码,数字间的默认间隔是一个空格, 浮点数的默认输出精度是保持小数点后2位。样例以外的提示信息请不要在屏幕上输出。
2.请大家确保提交的代码可以在指定的编译条件下正确地编译执行,否则自动评测程序将给出编译错误或运行时错误的信息。
3.每道编程题目,如果没有特殊说明,需要在1秒内完成程序的运行和输出结果,超过这个时间限制将会被判超时,失去相应测试用例的分数。每个可执行文件可使用的空间不得大于1MB。
4.每道编程题会有多个测试用例,每通过一些测试用例可以获得 相应的分值,只有通过全部测试用例才能拿到这题全部的分数。
题目思路
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int N = 100 + 10;
double a[N];
struct stu {
string name;
double score[10];
double total = 0;
}stu[100];
bool cmp(struct stu s1, struct stu s2)
{
if(s1.total<s2.total)
return false;
return true;
}
int main()
{
int k, n;
cin >> k;
for (int i = 0; i < k; i++)
{
cin >> a[i];
}
cin >> n;
double sum = 0;
for (int i = 0; i < n; i++)
{
cin >> stu[i].name;
for (int j = 0,sum = 0; j < k; j++)
{
cin >> stu[i].score[j];
stu[i].score[j] = stu[i].score[j] * a[j];
stu[i].total += stu[i].score[j];
}
}
sort(stu, stu + n, cmp);
cout << stu[0].name;
int i = 0;
for (i = 1; i<=n/10; i++)
{
cout << " " << stu[i].total;
}
if(i<n&&i>0)
while (stu[i].total == stu[i - 1].total && i < n) {
cout << " " << stu[i++].total;
}
return 0;
}