链接: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;
}