PAT A1075 PAT判事(25分)

PATのranklistは提出のスコアを示すステータスリストから生成されます。この時間は、あなたはPATのためにranklistを生成することになっています。

入力仕様:

各入力ファイルには、1つのテストケースが含まれています。各場合について、最初の行は、3つの正の整数、N(≤10含ま4)、ユーザーの総数は、K(≤5)、問題の総数、およびM(≤10 5)、総数提出。次に、ユーザIDのは、00001からNまで5桁の数字であることが想定され、そして問題のIDは次の行がK正の整数pを[I](I = 1、...、K)を含有するKに1、どこからのものですi番目の問題の完全なマークにP [i]に対応します。次いで、M行は、それぞれ次の形式で提出の情報を与え、次のとおり
USER_ID PROBLEM_ID partial_score_obtained
ここpartial_score_obtainedは提出もコンパイラを渡すことができない場合は-1のいずれかである、または範囲[0、P [PROBLEM_ID]の整数です。行のすべての数字は、スペースで区切られます。

出力仕様:

各テストケースのために、あなたが出力する次の形式でranklistを想定している:
ランクUSER_IDのtotal_score S [1] ... S [k]は
ランクがtotal_scoreに従って計算される場合、同じtotal_scoreを持つすべてのユーザが同じランクを得ます; 及びs [i]は、i番目の問題に関して得られた部分的なスコアです。ユーザーが問題の解決策を提出したことがない場合は、「 - 」は、対応する位置に印刷されなければなりません。ユーザーが1つの問題を解決するには、いくつかの解決策を提出した場合、最も高いスコアがカウントされます。
ranklistはランクの非減少順に印刷されなければなりません。同じランクを持っている人のために、ユーザーが完全に解決される問題の数に応じて非増加順にソートする必要があります。タイがまだあるなら、彼らは自分のIDのの昇順で印刷しなければなりません。コンパイラを渡すことができます任意のソリューションを提出したことがない、または任意の解決策を提出したことがない人のために、彼らはranklistに示されてはいけません。少なくとも1人のユーザがranklistに示すことができることが保証されます。

サンプル入力:

7 4 20
20 25 25 30
00002 2 12
00007 17 4
00005 119
00007 2 25
00005 1 20
00002 2 2
00005 1 15
00001 118
00004 3 25
00002 25 2
00005 3 22
00006 4 -1
00001 2 18
00002 1~20
00004 1 15
00002 18 4
00001 3 4
00001 4 2
00005 2 -1
00004 0 2

サンプル出力:

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 -

質問の意味:

次いで、第一のユーザ入力ライン数N、被検体Kの数、レコードのMの数、各質問のうち第二の入力線、及びユーザプログレッシブIDを入力し、項目番号、得られたスコアは、(-1提示が、コンパイルされていません) ;プログレッシブ出力順位をソート、ユーザID、合計スコア、各小問題のスコアは( - 提出されていないが、コンパイルによって提出されていない示し0(即ち、入力された画分が得られ-1)またはコンパイラが、0の送信スコアを表します。) 。

アイデア:

(1)] [構造学生STUのアレイを画定する、IDが含まれ、total_score、S [6] 、perfect_number、入力、 スコアはtotal_scoreを表し、S [1]〜S [ 5]は、各小問題のスコアを表し、perfect_numberが表します(スコアはタイトル-1出力が真の入力=を有効にするが得られず、一旦入力)スコアが(基準CMPの関数として)をトピックの数、学生を出力することができるかどうかの入力真または偽を表す情報である;
(2)初期化STU S [1]〜S [5だから[時間] ] -1、-1の入力タイトルスコアは、問題が提出が、コンパイラを介して、0点としてカウントされないことを示します。

コード:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

struct student{
	int id,total_score,s[6],perfect_number;
	bool input;
}stu[10010];
bool cmp(student a,student b){
	if(a.input!=b.input) return a.input>b.input;//true>false,先输出能编译的 
	else if(a.total_score!=b.total_score) return a.total_score>b.total_score;
	else if(a.perfect_number!=b.perfect_number) return a.perfect_number>b.perfect_number;
	else return a.id<b.id;	
}

int main(){
	int N,K,M;
	scanf("%d %d %d",&N,&K,&M);
	int full[6];
	for(int i=1;i<=K;i++){
		scanf("%d",&full[i]);
	}
	for(int i=1;i<=N;i++){//初始化stu[] 
		stu[i].id = i;//考生编号按序编制 
		stu[i].total_score = 0;//总分 
		stu[i].perfect_number = 0;//拿满分的题目数 
		stu[i].input = false;//是否输出 
		memset(stu[i].s,-1,sizeof(stu[i].s));//各小题分数,-1代表未提交过 
	}
	int user_id,pro_id,par_score;//用户id,题号,对应得分 
	for(int i=0;i<M;i++){
		scanf("%d %d %d",&user_id,&pro_id,&par_score);
		//一道题也没有提交 和 提交了但一道题也没有通过编译的情况下s[i]的值都为-1,所以:
		if(par_score!=-1){//一旦有编译通过的提交(得分不为-1) 
			stu[user_id].input = true;
		} 
		if(par_score==-1&&stu[user_id].s[pro_id]==-1){//提交但编译未通过,计0分 
			stu[user_id].s[pro_id] = 0;
		}
		if(par_score==full[pro_id]&&stu[user_id].s[pro_id]<full[pro_id]){//满分题目加1 
			stu[user_id].perfect_number++;
		}
		if(par_score>stu[user_id].s[pro_id]){//高分覆盖低分 
			stu[user_id].s[pro_id] = par_score;
		}
	}
	for(int i=1;i<=N;i++){//求总分 
		for(int j=1;j<=K;j++){
			if(stu[i].s[j]!=-1){
				stu[i].total_score+=stu[i].s[j];
			}
		}
	}
	sort(stu+1,stu+N+1,cmp);
	int rank=1;//排名,输出。 
	for(int i=1;i<=N&&stu[i].input==true;i++){
		if(i>1&&stu[i].total_score<stu[i-1].total_score){
			rank = i;
		}
		printf("%d %05d %d",rank,stu[i].id,stu[i].total_score);
		for(int j=1;j<=K;j++){
			if(stu[i].s[j]==-1){
				printf(" -");
			}else{
				printf(" %d",stu[i].s[j]);
			}
		}			
		printf("\n");	
	} 
	return 0;
}

用語集:

パーサジェネレータ

公開された26元の記事 ウォンの賞賛0 ビュー459

おすすめ

転載: blog.csdn.net/PanYiAn9/article/details/104259812