sicily 奖学金
题目
思路
很自然得到思路
除了按题意常规的输入输出外,主要是以下几个主要操作
1.构建结构体存放:学号、语数英成绩、总分
2.选择一种排序方法,并定义排序方式:这里选用较为简单的 选择排序。并有嵌套比较:总分(total)-> 语文成绩(chinese)->学号(ID)
trap
1.在coding过程中,反而陷入了 Presentation Error 的坑,原因是题目要求在两个trail中间输出一个空行!但绝不是在output后面加一个空行那么简单,!!注意是两个相邻测试数据之间 即:最后一个测试样例不要有空行输出。
但,怎么知道是最后一个测试样例呢?很简单,换个思路:在不是第一个测试样例前输出空行。<-机智
2.因为实现用的是升序排序,所以输出时要从数组尾部输出
实现
#include <iostream>
using namespace std;
struct data {
int ID;
int chinese;
int math;
int english;
int total;
};
typedef struct data student;
void select_sort(student s[], int num){
for (int position = num-1; position > 0; position--){
int max_index = 0;
for (int i = 0; i <= position; ++i) {
if (s[i].total > s[max_index].total){
max_index = i;
} else if (s[i].total == s[max_index].total){
if (s[i].chinese > s[max_index].chinese){
max_index=i;
} else if (s[i].chinese == s[max_index].chinese){
if (s[i].ID < s[max_index].ID){
max_index=i;
}
}
}
}
//swap
student temp = s[max_index];
s[max_index] = s[position];
s[position] = temp;
}
}
int main(){
int student_num;
int test = 0;
while(cin>>student_num){
student students[student_num];
//geting data
if (test) {
cout<<endl;
}
for (int i = 0; i < student_num; i++){
students[i].ID = i+1;
cin>>students[i].chinese;
cin>>students[i].math;
cin>>students[i].english;
students[i].total = (students[i].chinese + students[i].math + students[i].english);
}
select_sort(students,student_num);
for (int i = student_num-1; i >= student_num-5; i--) {
cout<<students[i].ID<<" "<<students[i].total<<endl;
}
test++;
}
return 0;
}