题目1061:成绩排序
2014-02-23 21:18
169 查看
题目描述:
有N个学生的数据,将学生数据按成绩高低排序,如果成绩相同则按姓名字符的字母序排序,如果姓名的字母序也相同则按照学生的年龄排序,并输出N个学生排序后的信息。
输入:
测试数据有多组,每组输入第一行有一个整数N(N<=1000),接下来的N行包括N个学生的数据。
每个学生的数据包括姓名(长度不超过100的字符串)、年龄(整形数)、成绩(小于等于100的正数)。
输出:
将学生信息按成绩进行排序,成绩相同的则按姓名的字母序进行排序。
然后输出学生信息,按照如下格式:
姓名 年龄 成绩
样例输入:
样例输出:
提示:
学生姓名的字母序区分字母的大小写,如A要比a的字母序靠前(因为A的ASC码比a的ASC码要小)。
有N个学生的数据,将学生数据按成绩高低排序,如果成绩相同则按姓名字符的字母序排序,如果姓名的字母序也相同则按照学生的年龄排序,并输出N个学生排序后的信息。
输入:
测试数据有多组,每组输入第一行有一个整数N(N<=1000),接下来的N行包括N个学生的数据。
每个学生的数据包括姓名(长度不超过100的字符串)、年龄(整形数)、成绩(小于等于100的正数)。
输出:
将学生信息按成绩进行排序,成绩相同的则按姓名的字母序进行排序。
然后输出学生信息,按照如下格式:
姓名 年龄 成绩
样例输入:
3 abc 20 99 bcd 19 97 bed 20 97
样例输出:
bcd 19 97 bed 20 97 abc 20 99
提示:
学生姓名的字母序区分字母的大小写,如A要比a的字母序靠前(因为A的ASC码比a的ASC码要小)。
#include <iostream> using namespace std; struct Stu { string name; int age; int score; }; int compare(string a,string b) { int m = a.size(); int n = b.size(); int min = (n<m)?n:m; for(int i=0;i<min;i++) { if(a[i]<b[i]) return 1; else if(a[i]>b[i]) return 2; } if(m<n) return 1; else if(m>n) return 2; else return 0; } bool compare(Stu a,Stu b) { if((a.score<b.score|| (a.score==b.score&&(compare(a.name,b.name)==1)) || (a.score==b.score&&(compare(a.name,b.name)==0)&&a.age<b.age))) return true; return false; } void quickSort(Stu arr[],int left,int right) { if(left<right) { int i = left,j = right; Stu key = arr[left]; while(i<j) { while(i<j&&compare(key,arr[j])) j--; if(i<j) arr[i++]=arr[j]; while(i<j&&compare(arr[i],key)) i++; if(i<j) arr[j--]=arr[i]; } arr[i]=key; quickSort(arr,left,i-1); quickSort(arr,i+1,right); } } int main() { Stu student[1000]; int num; while(cin>>num) { for(int i=0;i<num;i++) { cin>>student[i].name>>student[i].age>>student[i].score; } quickSort(student,0,num-1); for(int i=0;i<num;i++) { cout<<student[i].name<<" "<<student[i].age<<" "<<student[i].score<<endl; } } return 0; } /************************************************************** Problem: 1061 User: 小燧石 Language: C++ Result: Accepted Time:690 ms Memory:1520 kb ****************************************************************/