题目描述
Input
The input consists of several test cases and is terminated by end-of-file.
The first line of each test case contains an integer n.
The i-th of the following n lines contains 3 integers ai, bi and ci.
Output
Sample Input
2
1 1 1
1 1 2
2
1 1 2
1 1 1
3
1 3 1
2 2 1
3 1 1
Sample Output
2 1
1 2
1 2 3
Code
/*
* @Description: Sorting
* @version:
* @Author:
* @Date: 2021-04-06 23:23:25
* @LastEditors: Please set LastEditors
* @LastEditTime: 2021-04-07 15:35:39
*/
// 根据提示
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <string>
using namespace std;
typedef struct tuples tuples;
struct tuples
{
long long a;
long long b;
long long c;
};
vector<pair<tuples, int>> v;
bool cmp(pair<tuples, int> A, pair<tuples, int> B)
{
// NOTE:为防止精度问题,把除法换成乘法,要化简。看见数学公式就要想着推导
// NOTE:还要注意排序编号,而且注意当比较的两项相等时一定要返回false。
if (B.first.c * (A.first.a + A.first.b) < A.first.c * (B.first.a + B.first.b))
return true;
else if (B.first.c * (A.first.a + A.first.b) == A.first.c * (B.first.a + B.first.b))
return A.second < B.second;
return false;
}
int main(void)
{
int num;
while (scanf("%d", &num) != EOF)
{
v.erase(v.begin(), v.end());
for (int i = 0; i < num; i++)
{
tuples temp;
cin >> temp.a >> temp.b >> temp.c;
v.push_back(make_pair(temp, i + 1));
}
sort(v.begin(), v.end(), cmp);
for (int i = 0; i < v.size() - 1; i++)
{
cout << v[i].second << " ";
}
cout << v[v.size() - 1].second << endl;
}
return 0;
}