问题 F: 土豪学长算成绩
题目描述 给协会里的同学排成绩对于土豪学长来说总是一个很麻烦的事情,因为土豪学长不会使用excel表格,所以每次他都是手工排序的。现在协会的人数越来越多,手工排序变的不现实了,他希望你能够帮他写一个程序给同学们拍名次。考试的科目有语文,数学,英语,物理,化学,生物。首先按照总分排序,总分一样的按照语文分排序,语文分一样的按照数学排序,以此类推,科目的优先级:语文,数学,英语,物理,化学,生物,如果几门课的分数都一样,那么按照学生的编号排序(序号小的排前面)
输入 有多组输入数据。 每组数据第一行一个数字n,表示学生的个数。接下来n行,每行6个整数,分别对应上面的六门科目。学生按照输入顺序从1到n编号。当n为0的时候结束。六门科目分数的范围从0到100(包含),0<=n<=10000
输出 学生的id按照排名输出,每组数据的输出占一行。从第一名到最后一名输出。
样例输入 3 100 100 100 100 100 100 99 99 99 99 99 99 88 88 88 88 88 88 0 样例输出 1 2 3
思路:定义一个结构体数组,包含学号,各科成绩用一个整数型数组,还有总分,先对总分比较,若总分相等再依次与各科成绩比较,比较过程放在自定义的函数中,在主函数里进行冒泡排序。
编程语言: C++代码如下 :
#include<iostream> using namespace std; int s(int ,int ); //比较成绩 struct Student { int num; //学号 int g[6]; //输入六科成绩 int sum; //总分 } ; Student stu[10000]; //定义的结构体数组,尽量定大一点 int main() //运行错误很可能数组取得太小 { //格式错误,,说明答案正确,可能少个空格或换行符 int n; while(cin>>n) //多组输入 { if(n==0) return 0; for(int i=1;i<=n;i++) { stu[i].sum=0; // 成绩总分初始化为0 stu[i].num=i; //学号随i增加 for(int j=0;j<6;j++) cin>>stu[i].g[j]; for(int j=0;j<6;j++) stu[i].sum+=stu[i].g[j]; //六科成绩累加 } for(int i=1;i<n;i++) { int k=i; for(int j=i+1;j<=n;j++) { if(s(j,k)) //调用s函数,进行冒泡排序 k=j; } Student team=stu[i]; stu[i]=stu[k]; stu[k]=team; } for(int i=1;i<=n;i++) { cout<<stu[i].num<<" "; } cout<<endl; } return 0; } int s(int a,int b) { if(stu[a].sum>stu[b].sum) //先进行总分比较 return 1; else if(stu[a].sum<stu[b].sum) //总分相同时进行各科比较 return 0; else { for(int j=0;j<6;j++) { if(stu[a].g[j]==stu[b].g[j]) continue; else if(stu[a].g[j]>stu[b].g[j]) return 1; else return 0; } } }