生日排序
from jisuanke T1715
Time limit : 1000ms
Memory limit : 131072
题目描述:
蒜头学院开学了,老师要统计班里每个人的生日,并按照出生日期从早到晚排序。
输入格式:
第一行一个整数 n (1≤n≤100)n (1≤n≤100),班级班级的人数。
接下来 nn 行,每行包含一个字符串 ss 和三个整数 y,m,dy,m,d,表示姓名为 ss 的同学出生日期是 yy 年 mm 月 dd 日。
保证所有日期合法,姓名由小写字母构成,不超过 2020 个字符。
输出格式:
输出 nn 行,每行一个字符串表示姓名。如果有两个同学出生日期相同,输入靠后的同学先输出。
样例输入:
3
qwb 1996 6 30
gyt 1995 7 28
wc 1996 6 30
样例输出:
gyt
wc
qwb
sort:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct Node {
string name; //名字
int in; //输入顺序
int y, m, d; //年月日
};
bool cmp(Node a, Node b) {
if (a.y == b.y) {
if (a.m == b.m) {
if (a.d == b.d)
return a.in > b.in;
return a.d < b.d;
}
return a.m < b.m;
}
return a.y < b.y;
//比较规则,这里自己好好思考一下,年小排在前,相等看月,再相等看日,再相同看输入顺序
}
int main() {
int n; Node a;
cin >> n;
vector<Node> v;
for (int i = 1; i <= n; ++i)
cin >> a.name >> a.y >> a.m >> a.d, a.in = i, v.push_back(a);
sort(v.begin(), v.end(), cmp);
for (int i = 0; i < n; ++i)
cout << v[i].name << endl;
return 0;
}
priority_queue:
#include<iostream>
#include<queue>
using namespace std;
struct Node {
string name; //名字
int in; //输入顺序
int y, m, d; //年月日
};
struct cmp {
bool operator()(Node a, Node b){
if (a.y == b.y) {
if (a.m == b.m) {
if (a.d == b.d)
return a.in < b.in;
return a.d > b.d;
}
return a.m > b.m;
}
return a.y > b.y;
}//比较规则,这里自己好好思考一下,年小排在前,相等看月,再相等看日,再相同看输入顺序
};
int main() {
int n; Node a;
cin >> n;
priority_queue<Node, vector<Node>, cmp> q;
for (int i = 1; i <= n; ++i)
cin >> a.name >> a.y >> a.m >> a.d, a.in = i, q.push(a);
for (int i = 0; i < n; ++i)
cout << q.top().name << endl, q.pop();
return 0;
}