C++
1#include <iostream> // cin, cout
2#include <vector> // vector
3#include <algorithm> // sort
4using namespace std;
5
6struct Comp {
7 bool operator()(vector<int> &a, vector<int> &b) {
8 return b[0] == a[0] ? b[1] < a[1] : b[0] < a[0];
9 }
10};
11
12int main()
13{
14 int n;
15 cin >> n;
16 vector<vector<int>> num(n, vector<int>(2));
17
18 for (int i = 0;i < n;i++)
19 cin >> num[i][0] >> num[i][1];
20
21 sort(num.begin(), num.end(), Comp());
22
23 for (int i = 0; i < n; i++)
24 cout << num[i][0] << " " << num[i][1] << endl;
25}
関数オブジェクト Comp() が分かりにくければ、
比較関数 comp を定義しても構いません。
C++
1#include <iostream> // cin, cout
2#include <vector> // vector
3#include <algorithm> // sort
4using namespace std;
5
6bool comp(vector<int> &a, vector<int> &b)
7{
8 return b[0] == a[0] ? b[1] < a[1] : b[0] < a[0];
9}
10
11int main()
12{
13 int n;
14 cin >> n;
15 vector<vector<int>> num(n, vector<int>(2));
16
17 for (int i = 0; i < n;i++)
18 cin >> num[i][0] >> num[i][1];
19
20 sort(num.begin(), num.end(), comp);
21
22 for (int i = 0; i < n; i++)
23 cout << num[i][0] << " " << num[i][1] << endl;
24}
また、ラムダ式を使うやり方もあります。
C++
1#include <iostream> // cin, cout
2#include <vector> // vector
3#include <algorithm> // sort
4using namespace std;
5
6int main()
7{
8 int n;
9 cin >> n;
10 vector<vector<int>> num(n, vector<int>(2));
11
12 for (int i = 0; i < n;i++)
13 cin >> num[i][0] >> num[i][1];
14
15 sort(num.begin(), num.end(), [](vector<int> &a, vector<int> &b) {
16 return b[0] == a[0] ? b[1] < a[1] : b[0] < a[0];
17 });
18
19 for (int i = 0; i < n; i++)
20 cout << num[i][0] << " " << num[i][1] << endl;
21}
追記
vector ではなく、配列を使って、qsort でソートするなら、
C++
1#include <iostream>
2#include <cstdlib> // qsort
3using namespace std;
4
5int comp(const void *x, const void *y)
6{
7 int (*a)[2] = (int (*)[2])x, (*b)[2] = (int (*)[2])y;
8 return b[0] == a[0] ? b[1] - a[1] : b[0] - a[0];
9}
10
11int main(void)
12{
13 int num[100][2];
14 int n;
15 cin >> n;
16
17 for (int i = 0; i < n; i++)
18 cin >> num[i][0] >> num[i][1];
19
20 qsort(num, n, sizeof num[0], comp);
21
22 for (int i = 0; i < n; i++)
23 cout << num[i][0] << " " << num[i][1] << endl;
24}
追記2
return b[0] == a[0] ? b[1] < a[1] : b[0] < a[0]; を 3項演算子を使わずに書くと、
C++
1 if (b[0] == a[0])
2 return b[1] < a[1];
3 else
4 return b[0] < a[0];
となります。比較演算子 < による演算結果は true または false なので何の問題
もないのですが、比較演算の式はどうしても if文の中に書きたいというのなら、
C++
1 if (b[0] == a[0])
2 if (b[1] < a[1])
3 return true;
4 else
5 return false;
6 else
7 if (b[0] < a[0])
8 return true;
9 else
10 return false;
2020/07/13 10:55