题解 | #奥运排序问题#
奥运排序问题
https://www.nowcoder.com/practice/100a4376cafc439b86f5f8791fb461f3
复制结构体数组,之后四次排序,结果存原始数组中,最后算个最小值就可。
#include <bits/stdc++.h>
using namespace std;
int main() {
struct rat {
int id, gold, medal, people, rank[4];
};
int n, m;
function<bool(rat, rat)> cmp[4] = {
[](rat a, rat b) { return a.gold > b.gold; },
[](rat a, rat b) { return a.medal > b.medal; },
[](rat a, rat b) {
return 1.0 * a.gold / a.people > 1.0 * b.gold / b.people;
},
[](rat a, rat b) {
return 1.0 * a.medal / a.people > 1.0 * b.medal / b.people;
}};
while (cin >> n >> m) {
vector<rat> nums(n);
for (int i = 0; i < n; i++) {
nums[i].id = i;
cin >> nums[i].gold >> nums[i].medal >> nums[i].people;
}
vector<rat> tmp{nums};
for (int i = 0; i < 4; i++) {
sort(tmp.begin(), tmp.end(), cmp[i]);
nums[tmp[0].id].rank[i] = 0;
for (int j = 1; j < n; j++) {
if (cmp[i](tmp[j - 1], tmp[j])) {
nums[tmp[j].id].rank[i] = j;
} else {
nums[tmp[j].id].rank[i] = nums[tmp[j - 1].id].rank[i];
}
}
}
int x;
for (int i = 0; i < m; i++) {
cin >> x;
auto mi = min_element(nums[i].rank, nums[i].rank + 4);
cout << *mi + 1 << ":" << mi - nums[i].rank + 1 << endl;
}
cout << endl;
}
return 0;
}

