1075 PAT裁判官(25分)
PATのランクリストは、提出のスコアを示すステータスリストから生成されます。今回は、PATのランクリストを生成することになっています。
入力仕様:
各入力ファイルには1つのテストケースが含まれます。各場合について、最初の行は、3つの正の整数、N(≤10含ま
4
)、ユーザーの総数は、K(≤5)、問題の総数、およびM(≤10
5
) 、送信の総数。次に、ユーザーIDは00001からNまでの5桁の数字であり、問題IDは1からKまでであると想定されます。次の行には、Kの正の整数p [i](i = 1、…、K)が含まれます。 p [i]は、i番目の問題の完全なマークに対応します。次にM行が続き、それぞれが次の形式で提出の情報を提供します。
user_id problem_id partial_score_obtained
ここで、partial_score_obtainedは、提出物がコンパイラを通過できない場合は-1か、[0、p [problem_id]]の範囲の整数です。行内のすべての数値はスペースで区切られています。
出力仕様:
各テストケースについて、ランクリストを次の形式で出力します。
ランクuser_id total_score s [1]…s [K]
ここで、ランクはtotal_scoreに従って計算され、同じtotal_scoreを持つすべてのユーザーは同じランクを取得します。s [i]は、i番目の問題について取得された部分スコアです。ユーザーが問題の解決策を提出したことがない場合は、対応する位置に「-」を印刷する必要があります。ユーザーが1つの問題を解決するためにいくつかのソリューションを提出した場合、最高のスコアがカウントされます。
ランクリストは、ランクの降順でない順序で印刷する必要があります。同じランクのユーザーの場合、ユーザーは、完全に解決された問題の数に従って、昇順に並べ替える必要があります。それでも同点がある場合は、IDの昇順で印刷する必要があります。コンパイラーを渡すことができるソリューションを提出したことがない、またはソリューションを提出したことがない人は、ランクリストに表示してはいけません。ランクリストに少なくとも1人のユーザーを表示できることが保証されています。
入力例:
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 -
問題解決
質問の条件を1つずつ分析します
。1。並べ替え方法:
合計スコアを大から小に並べ替えます。
合計スコアが同じである場合、フルスコアの質問の数を多から小に並べ替えます。
フルスコアが同じである場合、並べ替えは小から大です。
上記構成によれば機能は、設定を必要と、
スコアの合計、対象の分別問題、学生番号IDは、タイトル番号passnumのうち、対象はコンパイラフラグが提出したかどうかを決定する; (件名の質問がで問題なく提出することを提出するかどうかを要求されますコンパイルされたクラスメートは出力しません。)
struct User{
int Sum=0;
int Problem[6];
int Id;
int Passnum=0;
int flag=0;
}users[MAXN];
比較関数:
合計スコアが異なる場合、スコアは高くなります。合計スコアが同じである場合、問題の数は不合格となり、最初の質問が多くなります。合計スコアが同じ場合、生徒数は少なくなります。
bool compare (User a,User b)
{
if(a.Sum!=b.Sum) return a.Sum>b.Sum;
else
{
if(a.Passnum!=b.Passnum) return a.Passnum>b.Passnum;
else return a.Id<b.Id;
}
}
2. 入力機能
必要に応じて入力します。
注:提出が繰り返されるため、すべての入力が完了するまで合計スコアは計算されません。
提出スコアが元のスコアより大きく、フルスコアと同じである
場合、フルマークの数は+1です。提出スコアが-1でない場合、ユーザーはマークされますスキップする
int N,K,M;
int p[6];
void input()
{
cin>>N>>K>>M; //输入人数,题目数,总提交数
for(int i=1;i<=K;i++)
cin>>p[i]; //每一题的总分
for(int i=1;i<=N;i++)
fill(users[i].Problem,users[i].Problem+6,-2);
int a,b;
int grade;
for(int i=0;i<M;i++)
{
cin>>a>>b>>grade;
users[a].Id=a;
if(grade!=-1) users[a].flag=1;
if(grade>users[a].Problem[b])
{
users[a].Problem[b]=grade;
if(users[a].Problem[b]==p[b])
++users[a].Passnum;
}
}
//输入完毕;计算sum
for(int i=1;i<=N;i++)
{
for(int j=1;j<=K;j++)
if(users[i].Problem[j]>0) users[i].Sum+=users[i].Problem[j];
}
}
完全なコードは
単純です。詳細に注意してください。
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 10010
struct User{
int Sum=0;
int Problem[6];
int Id;
int Passnum=0;
int flag=0;
}users[MAXN];
int N,K,M;
int p[6];
void input()
{
cin>>N>>K>>M; //输入人数,题目数,总提交数
for(int i=1;i<=K;i++)
cin>>p[i]; //每一题的总分
for(int i=1;i<=N;i++)
fill(users[i].Problem,users[i].Problem+6,-2);
int a,b;
int grade;
for(int i=0;i<M;i++)
{
cin>>a>>b>>grade;
users[a].Id=a;
if(grade!=-1) users[a].flag=1;
if(users[a].Problem[b]==0)
{
users[a].Problem[b]=grade;
if(users[a].Problem[b]==p[b])
++users[a].Passnum;
}
else if(grade>users[a].Problem[b])
{
users[a].Problem[b]=grade;
if(users[a].Problem[b]==p[b])
++users[a].Passnum;
}
}
//输入完毕;计算sum
for(int i=1;i<=N;i++)
{
for(int j=1;j<=K;j++)
if(users[i].Problem[j]>0) users[i].Sum+=users[i].Problem[j];
}
}
//存放完毕
//p里面时题目总分;
//user里面是人id,题目id,题目分数
bool compare (User a,User b)
{
if(a.Sum!=b.Sum) return a.Sum>b.Sum;
else
{
if(a.Passnum!=b.Passnum) return a.Passnum>b.Passnum;
else return a.Id<b.Id;
}
}
void ASort()
{
sort(users+1,users+N+1,compare);
}
void output()
{
int temp=0;
int index=0;
int tempindex=0;
/*5、最后一个输出,一道题都没有提交或者提交但没有一道题通过编译的同学不输出。
(一定要注意,提交没有通过编译和提交得零分完全是两个概念,
所以在这里输出的时候一定要注意,后者是需要输出的)*/
for(int i=1;i<=N;i++)
{
if(users[i].flag==0) continue;
++tempindex;
if(users[i].Sum!=temp)
{
index=tempindex;
temp=users[i].Sum;
}
printf("%d %05d %d",index,users[i].Id,users[i].Sum);
for(int j=1;j<=K;j++)
if (users[i].Problem[j]>=0) printf(" %d",users[i].Problem[j]);
else if(users[i].Problem[j]==-1) printf(" 0");
else if(users[i].Problem[j]==-2) printf(" -");
cout<<endl;
}
}
int main()
{
input();
ASort();
output();
}