注意本题只能用unordered_map
不能用map
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 10;
int n, k, m;
int idx = 1;
int p[6];
int vis[N];
struct S
{
int total_score;
int num;
int rank;
string user_id;
int score[6];
int st1[6], st2[6];
S()//构造函数
{
for(int i = 1; i <= 5; i ++)
score[i] = 0;
}
bool operator<(S s)
{
if(s.total_score != total_score)
return total_score > s.total_score;//不能调换位置
if(s.num != num)
return num > s.num;
return user_id < s.user_id;
}
}s[N];
int main()
{
cin >> n >> k >> m;
for(int i = 1; i <= k; i ++)
cin >> p[i];
unordered_map<string, int> map;
while (m -- )
{
string user_id;
int q_id;
int ss;
cin >> user_id >> q_id >> ss;
if(!map[user_id])
map[user_id] = idx ++;
int t = map[user_id];
s[t].user_id = user_id;
s[t].score[q_id] = max(s[t].score[q_id], ss);
if(ss != -1)
s[t].st2[q_id] = 1;
s[t].st1[q_id] = 1;
}
for(int i = 1; i < idx; i ++)
{
int cnt1 = 0, cnt2 = 0;
for(int j = 1; j <= k; j ++)
{
if(s[i].score[j] == p[j])
s[i].num ++;
s[i].total_score += s[i].score[j];
if(!s[i].st1[j])
cnt1 ++;
if(!s[i].st2[j])
cnt2 ++;
}
if(cnt1 == k || cnt2 == k)
vis[stoi(s[i].user_id)] = 1;
}
sort(s + 1, s + idx);
s[1].rank = 1;
int num = 2;
for(int i = 2; i < idx; i ++)
{
if(s[i].total_score == s[i - 1].total_score)
s[i].rank = s[i - 1].rank;
else
s[i].rank = num;
num ++;
}
for(int i = 1; i < idx; i ++)
{
if(!vis[stoi(s[i].user_id)])
{
cout << s[i].rank << ' ' << s[i].user_id << ' ' << s[i].total_score << ' ';
for(int j = 1; j <= k; j ++)
{
if(!s[i].st1[j])
cout << '-' << ' ';
else
cout << s[i].score[j] << ' ';
}
cout << endl;
}
}
return 0;
}