链接:https://ac.nowcoder.com/acm/problem/15056
来源:牛客网

题目描述
在ACM竞赛中,当遇到有两个队伍(人) 解出相同的题目数量的时候,我们需要通过他们解决问题的总时间进行排序。
一共有 N(1<=N<=5,000)条时间被以时(0<=Hours<=99), 分(0<=Minutes<=59),秒(0<=Seconds<=59)的形式记录。
你必须要把他们按时,分,秒排序为 升序,最少的时间最先。 考虑到如下的样例,这三个解出相同题目数量的时间为
11:20:20
11:15:12
14:20:14
正确的排序结果应该是这样的:
11:15:12
11:20:20
14:20:14
输入描述:

第 1 行,一个整数 N 第 2~n+1 行,每行 3 个整数,表示时,分,秒

输出描述:

共 n 行,每行 3 个整数,表示排序完后的结果

示例1
输入
复制

3
11 20 20
11 15 12
14 20 14

输出
复制

11 15 12
11 20 20
14 20 14

说明

所以在保证能做对的情况下,我们应当尽量减少罚时



简单的结构体排序
刚开始想偷懒直接返回string的比较,WA了一发后想起来要补齐前导0才能返回string的比较,

#define debug
#ifdef debug
#include <time.h>
#include "/home/majiao/mb.h"
#endif


#include <iostream>
#include <algorithm>
#include <vector>
#include <string.h>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <math.h>
#define MAXN ((int)1e5+7)
#define ll long long int
#define INF (0x7f7f7f7f)
#define QAQ (0)

using namespace std;

#ifdef debug
#define show(x...) \ do { \ cout << "\033[31;1m " << #x << " -> "; \ err(x); \ } while (0)
void err() { cout << "\033[39;0m" << endl; }
#endif

template<typename T, typename... A>
void err(T a, A... x) { cout << a << ' '; err(x...); }

int n, m, Q, K;
struct Node {
	int a, b, c;
	string str;
	bool operator < (const Node& no) const {
#if 1
		if(a == no.a) {
			if(b == no.b) return c < no.c;
			return b < no.b;
		}
		return a < no.a;
#else
		//不能直接返回string,除非对不足位数的数字补齐前导0 
		return str < no.str;
#endif
	}
} a[MAXN];
int main() {
#ifdef debug
	freopen("test", "r", stdin);
	clock_t stime = clock();
#endif
	scanf("%d ", &n);
	for(int i=1; i<=n; i++) {
		scanf("%d %d %d ", &a[i].a, &a[i].b, &a[i].c);
// 不能直接返回string,除非对不足位数的数字补齐前导0 
// a[i].str = to_string(a[i].a) + to_string(a[i].b) + to_string(a[i].c);
	}
	sort(a+1, a+1+n);
	for(int i=1; i<=n; i++)
		printf("%d %d %d\n", a[i].a, a[i].b, a[i].c);

#ifdef debug
	clock_t etime = clock();
	printf("rum time: %lf 秒\n",(double) (etime-stime)/CLOCKS_PER_SEC);
#endif 
	return 0;
}