题目1061:成绩排序
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:26843
解决:7772
-
题目描述:
-
有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码要小)。
-
答疑:
- 解题遇到问题?分享解题心得?讨论本题请访问: http://t.jobdu.com/thread-7785-1-1.html
-
- 思路:利用c++的容器STL提供的sort()排序函数就很好,特别简单方便。
-
#include <iostream> #include <algorithm> #include <fstream> using namespace std; struct Node { string name; int age; int grade; }student[1001]; bool cmp(const Node &a,const Node &b) { if(a.grade!=b.grade) return a.grade<b.grade; else if(a.name!=b.name) return a.name<b.name; else return a.age<b.age; } /* 7 typedef struct { 8 char name[101]; 9 int age; 10 int score; 11 }stu; 12 13 stu s[1000]; 14 15 bool cmp(stu a, stu b){ 16 if(a.score != b.score) 17 return a.score < b.score; 18 else if(strcmp(a.name, b.name) != 0)//当name 是字符数组的时候 19 return strcmp(a.name, b.name) < 0; 20 else 21 return a.age < b.age; 22 } */ int main() { ifstream in; in.open("1.txt"); int n; while(in>>n) { for(int i=0;i<n;++i) in>>student[i].name>>student[i].age>>student[i].grade; sort(student,student+n,cmp); for(int i=0;i<n;++i) cout<<student[i].name<<" "<<student[i].age<<" "<<student[i].grade<<endl; } return 0; }
(2)下面给一个自己写排序的暴力解决 -
#include <iostream> using namespace std; struct student { string name; int age; int score; }; int main() { int num = 0; while(cin >> num) { student arr[num]; for(int i = 0; i < num; i++) { cin >> arr[i].name >> arr[i].age >> arr[i].score; } for(int i = num - 1; i >= 0; i--) { for(int j = 0; j < i; j++) { if((arr[j].score > arr[j+1].score) || (arr[j].score == arr[j+1].score && arr[j].name > arr[j+1].name) || (arr[j].score == arr[j+1].score && arr[j].name == arr[j+1].name && arr[j].age > arr[j+1].age)) { student tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmp; } } } for(int i = 0; i < num; i++) { cout << arr[i].name << " " << arr[i].age << " " << arr[i].score << "\n"; } } return 0; }
(3)在来个厉害的,大神写的就是不一样 -
#include <iostream> #include <fstream> #include <string> #include <vector> #include <algorithm> using namespace std; struct Student { string name; int score; int age; bool operator < (const Student &other) const { if (score != other.score) return score < other.score; if (name != other.name) return name < other.name; return age < other.age; } }; int main() { int n; #ifndef ONLINE_JUDGE ifstream cin("d:\\OJ\\uva_in.txt"); #endif while (cin >> n) { vector<Student> v(n); for (int i = 0; i < n; i++) { cin >> v[i].name >> v[i].age >> v[i].score; } sort(v.begin(), v.end()); for (size_t i = 0; i < v.size(); i++) { cout << v[i].name << " " << v[i].age << " " << v[i].score << endl; } } return 0; }