这类不考察特定算法、只考察基础数据结构的题目某种程度上就是“翻译题”,没有无法下笔的情况,但一般规矩很复杂,想要拿满分很难,需要非常细心,代码也需要逻辑正确,考虑到各个方面。
#include<stdio.h>
#include<vector>
#include<memory.h>
#include<map>
#include<algorithm>
using namespace std;
struct User
{
int id;
int sum;
int perfect;
int problem[6];
bool valid; // 是否有有效提交,没有的话不输出
void init()
{
sum = 0;
perfect = 0;
valid = false;
for (int i = 0; i < 6; i++)
{
problem[i] = -2;
}
}
};
bool compare(User A, User B)
{
if (A.sum != B.sum)
{
return (A.sum > B.sum);
}
else if (A.perfect != B.perfect)
{
return (A.perfect > B.perfect);
}
else if (A.valid != B.valid)
{
return (A.valid > B.valid);
}
else
{
return (A.id < B.id);
}
}
int main()
{
int N, K, M;
scanf("%d%d%d", &N, &K, &M);
int P[6];
for (int i = 1; i <= K; i++)
{
scanf("%d", &P[i]);
}
map<int, int> m;
vector<User> users;
int size = 0;
for (int i = 0; i < M; i++)
{
int id, problem, score;
scanf("%d%d%d", &id, &problem, &score);
if (m.count(id) == 0)
{
m[id] = size++;
User user;
user.init();
user.id = id;
users.push_back(user);
}
if (score > users[m[id]].problem[problem])
{
if (score == P[problem])
{
users[m[id]].perfect++;
}
if (score >= 0)
{
users[m[id]].valid = true;
users[m[id]].sum += score - (users[m[id]].problem[problem] >= 0 ? users[m[id]].problem[problem] : 0);
}
users[m[id]].problem[problem] = score;
}
}
sort(users.begin(), users.end(), compare);
User u = users.front();
printf("1 %05d %d", u.id, u.sum);
for (int i = 1; i <= K; i++)
{
if (u.problem[i] == -1)
{
printf(" 0");
}
else if (u.problem[i] == -2)
{
printf(" -");
}
else
{
printf(" %d", u.problem[i]);
}
}
printf("\n");
int rank = 1;
for (int i = 1; i < users.size(); i++)
{
if (users[i].valid)
{
if (users[i].sum == users[i - 1].sum)
{
printf("%d %05d %d", rank, users[i].id, users[i].sum);
}
else
{
printf("%d %05d %d", i + 1, users[i].id, users[i].sum);
rank = i + 1;
}
for (int j = 1; j <= K; j++)
{
if (users[i].problem[j] == -1)
{
printf(" 0");
}
else if (users[i].problem[j] == -2)
{
printf(" -");
}
else
{
printf(" %d", users[i].problem[j]);
}
}
printf("\n");
}
else
{
break;
}
}
return 0;
}