排序题
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <map> using namespace std; const int N = 100005; int score[10]; struct Node { int id; int problem; int get; }person[N]; struct ANS { int rank; int id; int total; int get[6]; bool flag; int perfect; }ans[10005]; int cmp1(const ANS &a, const ANS &b) { if (a.total != b.total) return a.total > b.total; if (a.perfect != b.perfect) return a.perfect > b.perfect; else return a.id < b.id; } void get_total(int n, int m, int k) { int i = 0, j = 0; for (i = 1; i <= n; i++) { for (j = 1; j <= m; j++) ans[i].get[j] = -2; ans[i].flag = 0; ans[i].perfect = 0; } for (i = 0; i < k; i++) { int idx = person[i].id; int pro = person[i].problem; int soc = person[i].get; if (soc == score[pro] && ans[idx].get[pro] != soc) ans[idx].perfect++; if (soc > ans[idx].get[pro]) ans[idx].get[pro] = soc; } for (i = 1; i <= n; i++) { int sum = 0; for (j = 1; j <= m; j++) { if (ans[i].get[j] >= 0) { ans[i].flag = 1; sum += ans[i].get[j]; } } ans[i].total = sum; ans[i].id = i; } } void get_rank(int n) { int rank = 1; int i = 0; ans[1].rank = 1; for (i = 2; i <= n; i++) { if (ans[i].total == ans[i - 1].total) ans[i].rank = ans[i - 1].rank; else ans[i].rank = i; } } void print_info(int n, int m) { for (int i = 1; i <= n; i++) { if (ans[i].flag == 0) continue; printf("%d %05d %d", ans[i].rank, ans[i].id, ans[i].total); for (int j = 1; j <= m; j++) { if (ans[i].get[j] == -2) printf(" -"); else if (ans[i].get[j] == -1) printf(" 0"); else printf(" %d", ans[i].get[j]); } printf(" "); } } int main() { int n, m, k; int i; while (scanf("%d%d%d", &n, &m, &k) != EOF) { for (i = 1; i <= m; i++) scanf("%d", &score[i]); for (i = 0; i < k; i++) scanf("%d%d%d", &person[i].id, &person[i].problem, &person[i].get); //sort(person, person, cmp); get_total(n, m, k); sort(ans + 1, ans + n + 1, cmp1); get_rank(n); print_info(n, m); } return 0; }