1.タイトルの説明
原题链接
PATのランクリストは、提出のスコアを示すステータスリストから生成されます。今回は、PATのランクリストを生成することになっています。
入力仕様:
出力仕様:
入力例:
7 4 20
20 25 25 30
00002 2 12
00007 4 17
00005 1 19
00007 2 25
00005 1 20
00002 2 2
00005 1 15
00001 1 18
00004 3 25
00002 2 25
00005 3 22
00006 4 -1
00001 2 18
00002 1 20
00004 1 15
00002 4 18
00001 3 4
00001 4 2
00005 2 -1
00004 2 0
出力例:
1 00002 63 20
25-18 2 00005 42 20 0 22-2
00007 42-25-17
2 00001 42 18 18 4 2
5 00004 40 15 0 25-
2、問題解決のアイデア
構造分類質問、各候補をID、AC質問の数、ランキング、およびmk(学生がコンパイルによって提出できるかどうかをマーク)、および各質問のスコアを表す成績配列を含む構造に設定します、grade [0]を使用して合計スコアを表します。コードは理解しやすいですが、少し長く...
3、ACコード
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 10010;
struct User
{
int id, perfect=0, rank, mk=-1;//mk: 是否有能通过编译的提交,若没有则不打印
int grade[6] = {
0, -1, -1, -1, -1, -1};
}u[maxn];
int p[6];
bool checked[maxn] = {
false}; //标记是否有过提交
bool cmp(User a, User b) //排序函数
{
if(a.grade[0] != b.grade[0]) return a.grade[0] > b.grade[0];
else if(a.perfect != b.perfect) return a.perfect > b.perfect;
else return a.id < b.id;
}
int main()
{
vector<User> all;
vector<int> idx;
int N, K, M, tmp, pid, tmpgrade;
scanf("%d%d%d", &N, &K, &M);
for(int i=1; i<=K; i++) scanf("%d", &p[i]);
for(int i=0; i<M; i++)
{
scanf("%d%d%d", &tmp, &pid, &tmpgrade);
u[tmp].id = tmp;
if(tmpgrade != -1) u[tmp].mk = 1; //有可以编译通过的题目
else tmpgrade = 0;
if(tmpgrade > u[tmp].grade[pid])
u[tmp].grade[pid] = tmpgrade;
if(checked[tmp]) continue;
else
{
checked[tmp] = true;
idx.push_back(tmp);
}
}
for(int i=0; i<idx.size(); i++)
{
for(int j=1; j<=K; j++)
{
if(u[idx[i]].grade[j]>=0)
{
u[idx[i]].grade[0] += u[idx[i]].grade[j];
if(u[idx[i]].grade[j] == p[j])
u[idx[i]].perfect++;
}
else continue;
}
if(u[idx[i]].mk > 0) all.push_back(u[idx[i]]);
}
sort(all.begin(), all.end(), cmp);
for(int i=0; i<all.size(); i++)
{
if(i == 0) all[i].rank = 1;
else
{
if(all[i].grade[0] == all[i-1].grade[0]) all[i].rank = all[i-1].rank;
else all[i].rank = i+1;
}
printf("%d %05d", all[i].rank, all[i].id);
for(int j=0; j<=K; j++)
{
if(all[i].grade[j] >= 0) printf(" %d", all[i].grade[j]);
else printf(" -");
}
if(i != all.size()-1)
printf("\n");
}
return 0;
}