题目链接:传送门
思路:分数用-2表示未提交,-1表示编译未通过,用结构体直接模拟排序即可。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
struct node {
int id , rank , sum , num;
int po[6];
bool operator < (const node b)const {
return rank < b.rank || (rank == b.rank && num > b.num) || (rank == b.rank && num == b.num && id < b.id);
}
}a[maxn];
bool cmp(node c , node d) {
return c.sum > d.sum;
}
int f[6];
int main() {
int n , k , m;
ios::sync_with_stdio(0);
cin >> n >> k >> m;
for(int i = 0 ; i < k ; i++)cin >> f[i];
for(int i = 0 ; i < n ; i++) {
for(int j = 0 ; j < k ; j++) {
a[i].po[j] = -2;
a[i].id = i + 1;
}
}
for(int i = 0 ; i < m ; i++) {
int u_id;
int t_id , sc;
cin >> u_id >> t_id >> sc;
if(a[u_id - 1].po[t_id - 1] < sc)a[u_id - 1].po[t_id - 1] = sc;
}
for(int i = 0 ; i < n ; i++) {
for(int j = 0 ; j < k ; j++) {
if(a[i].po[j] >= 0)
a[i].sum += a[i].po[j];
//cout << " i = " << i << " po=" << a[i].po[j] << "sum = " << a[i].sum << "\n";
if(a[i].po[j] == f[j])a[i].num++;
}
}
sort(a , a + n , cmp);
a[0].rank = 1;
for(int i = 1 ; i < n ; i++) {
if(a[i].sum == a[i - 1].sum)a[i].rank = a[i - 1].rank;
else a[i].rank = i + 1;
}
sort(a , a + n);
for(int i = 0 ; i < n ; i++) {
if(a[i].sum == 0) {
bool flag = 0;
for(int j = 0 ; j < k ; j++) {
if(a[i].po[j] >= 0) {
flag = 1;break;
}
}
if(!flag)continue;
}
cout << a[i].rank;
cout << " " << setw(5) << setfill('0') << a[i].id;
cout << " " << a[i].sum;
for(int j = 0 ; j < k ; j++) {
if(a[i].po[j] >= 0)cout << " " << a[i].po[j];
else if(a[i].po[j] == -2)cout << " " << "-";
else cout << " " << 0;
}
cout << "\n";
}
return 0;
}