Sorting Tuples
Write a program which reads n items and sorts them. Each item has attributes {value, weight, type, date, name} and they are represented by { integer, integer, upper-case letter, integer, string } respectively. Sort the items based on the following priorities.
- first by value (ascending)
- in case of a tie, by weight (ascending)
- in case of a tie, by type (ascending in lexicographic order)
- in case of a tie, by date (ascending)
- in case of a tie, by name (ascending in lexicographic order)
Input
The input is given in the following format.
n
v0 w0 t0 d0 s0
v1 w1 t1 d1 s1
:
vn−1 wn−1 tn−1 dn−1 sn−1
In the first line, the number of items n. In the following n lines, attributes of each item are given. vi wi ti di si represent value, weight, type, date and name of the i-th item respectively.
Constraints
Output
Print attributes of each item in order. Print an item in a line and adjacency attributes should be separated by a single space.
Sample Input
5
105 24 C 1500000000000 white
100 23 C 1500000000000 blue
105 23 A 1480000000000 pink
110 25 B 1500000000000 black
110 20 A 1300000000000 gree
Sample Output
100 23 C 1500000000000 blue
105 23 A 1480000000000 pink
105 24 C 1500000000000 white
110 20 A 1300000000000 gree
110 25 B 1500000000000 black
問題を解く
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
struct item {
int v;
int w;
char t;
ll d;
string s;
};
bool compare(const item& a, const item& b) {
if (a.v == b.v)
{
if (a.w == b.w)
{
if (a.t == b.t)
{
if (a.d == b.d)
{
return a.s < b.s;
}
return a.d < b.d;
}
return a.t < b.t;
}
return a.w < b.w;
}
return a.v < b.v;
}
int main()
{
int n;
cin >> n;
vector<item> p(n);
for (int i = 0; i < n; i++)
{
cin >> p[i].v >> p[i].w >> p[i].t >> p[i].d >> p[i].s;
}
sort(p.begin(), p.end(), compare);
for (int i = 0; i < n; i++)
{
cout << p[i].v << " " << p[i].w << " " << p[i].t << " " << p[i].d << " " << p[i].s << endl;
}
return 0;
}
总结
- 用结构体构造vector是很棒的思路,mark一下sort的用法,第三个参数即排序标准。