简单的排序题,唯一的坑点在于名次并列,例如a考了95分,b考了95分,c考了90分,那么a和b并列第一(名次都是1),然后c的名次为3.
此外还考虑了下c++中double类型如何判断相等的问题,代码中注释部分
#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <functional>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
struct node {
int jin;
int sum;
int people;
double av1;
double av2;
int first;
int second;
int third;
int fourth;
int num;
} a[350], b[350];
bool cmp1(node x, node y) { return x.jin > y.jin; }
bool cmp2(node x, node y) { return x.sum > y.sum; }
bool cmp3(node x, node y) { return x.av1 > y.av1; }
bool cmp4(node x, node y) { return x.av2 > y.av2; }
int main(int argc, char const *argv[]) {
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> a[i].jin >> a[i].sum >> a[i].people;
a[i].av1 = 1.0 * a[i].jin / a[i].people;
a[i].av2 = 1.0 * a[i].sum / a[i].people;
a[i].num = i;
}
sort(a, a + n, cmp1);
for (int i = 0; i < n; i++) {
if (i > 0 && a[i - 1].jin == a[i].jin)//如果金牌数和前面一名的金牌数相等,那么他们的名次也相等(并列名次)
b[a[i].num].first = b[a[i - 1].num].first;
else
b[a[i].num].first = i + 1;
}
sort(a, a + n, cmp2);
for (int i = 0; i < n; i++) {
if (i > 0 && a[i - 1].sum == a[i].sum)//与上面同理
b[a[i].num].second = b[a[i - 1].num].second;
else
b[a[i].num].second = i + 1;
}
sort(a, a + n, cmp3);
for (int i = 0; i < n; i++) {
if (i > 0 && abs(a[i - 1].av1 - a[i].av1) < 1e-5)//这里我怕double比较的时候精度出现问题,所以谨慎了一下,但是就这道题来说直接用==也能全对,似乎有点水?
b[a[i].num].third = b[a[i - 1].num].third;
else
b[a[i].num].third = i + 1;
}
sort(a, a + n, cmp4);
for (int i = 0; i < n; i++) {
if (i > 0 && abs(a[i - 1].av2 - a[i].av2) < 1e-5)//精度问题同上
b[a[i].num].fourth = b[a[i - 1].num].fourth;
else
b[a[i].num].fourth = i + 1;
}
bool flag = false;
while (m--) {
int x;
cin >> x;
if (b[x].first <= b[x].second && b[x].first <= b[x].third &&
b[x].first <= b[x].fourth)
if (!flag)
printf("%d:%d", b[x].first, 1);
else
printf(" %d:%d", b[x].first, 1);
else if (b[x].second <= b[x].first && b[x].second <= b[x].third &&
b[x].second <= b[x].fourth)
if (!flag)
printf("%d:%d", b[x].second, 2);
else
printf(" %d:%d", b[x].second, 2);
else if (b[x].third <= b[x].first && b[x].third <= b[x].second &&
b[x].third <= b[x].fourth)
if (!flag)
printf("%d:%d", b[x].third, 3);
else
printf(" %d:%d", b[x].third, 3);
else if (b[x].fourth <= b[x].first && b[x].fourth <= b[x].second &&
b[x].fourth <= b[x].third)
if (!flag)
printf("%d:%d", b[x].fourth, 4);
else
printf(" %d:%d", b[x].fourth, 4);
flag = true;
}
return 0;
}