Pat 甲级 训练真题集 1075!

1075. PAT Judge (25)

​ 时间限制

​ 200 ms

​ 内存限制

​ 65536 kB

​ 代码长度限制

​ 16000 B

​ 判题程序

​ Standard

​ 作者

​ CHEN, Yue

The ranklist of PAT is generated from the status list, which shows the scores of the submittions. This time you are supposed to generate the ranklist for PAT.

Input Specification:

Each input file contains one test case. For each case, the first line contains 3 positive integers, N (<=104), the total number of users, K (<=5), the total number of problems, and M (<=105), the total number of submittions. It is then assumed that the user id’s are 5-digit numbers from 00001 to N, and the problem id’s are from 1 to K. The next line contains K positive integers p[i] (i=1, …, K), where p[i] corresponds to the full mark of the i-th problem. Then M lines follow, each gives the information of a submittion in the following format:

user_id problem_id partial_score_obtained

where partial_score_obtained is either -1 if the submittion cannot even pass the compiler, or is an integer in the range [0, p[problem_id]]. All the numbers in a line are separated by a space.

Output Specification:

For each test case, you are supposed to output the ranklist in the following format:

rank user_id total_score s[1] … s[K]

where rank is calculated according to the total_score, and all the users with the same total_score obtain the same rank; and s[i] is the partial score obtained for the i-th problem. If a user has never submitted a solution for a problem, then “-“ must be printed at the corresponding position. If a user has submitted several solutions to solve one problem, then the highest score will be counted.

The ranklist must be printed in non-decreasing order of the ranks. For those who have the same rank, users must be sorted in nonincreasing order according to the number of perfectly solved problems. And if there is still a tie, then they must be printed in increasing order of their id’s. For those who has never submitted any solution that can pass the compiler, or has never submitted any solution, they must NOT be shown on the ranklist. It is guaranteed that at least one user can be shown on the ranklist.

Sample Input:

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

Sample Output:

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 -

这道题让我好烦。。。

本来只花了30分钟就已经得了22分,除了最后一个测试点没过,然后我一直不知道我是哪错了,就在网上看了他们的AC代码,然后所有思路也大致相同,就没搞懂为啥他们对了我有个测试点没过,然后又看了一个参考的,最后一气之下将自己的主函数所有逻辑全换成AC代码的,,然后还是没过。。。这个时候我想砸电脑了。。。

然后我看还有哪不同,,,就只有排序规则了。。。。然后将排序规则改了,就对了。。。我要疯。。如果排序规则不对的话那为什么前面的测试点能过。。

我真的好无奈。。。。逻辑一直没问题,就在这找,,好烦,,尴尬

看来以后就用下面代码的cmp1了吧,cmp2以前都对。。现在不对了。。。

卧槽。。。。我在这里重新看了下我的排序,,第三个判断条件忘了将>改成==

杀了我吧,在此记录我的愚蠢,白白浪费如此多的时间

代码如下:

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

struct User{
	int rank;
	int id;
	int total=0;
	vector<int>v;
	int cnt=0;
	int flag=0;
	
};

bool cmp2(User u1,User u2){
	if(u1.total>u2.total){
		return 1;
	}
	if(u1.total==u2.total&&u1.cnt>u2.cnt){
		return 1;
	}
	if(u1.total==u2.total&&u1.cnt==u2.cnt&&u1.id<u2.id){
		return 1;
	}
	return 0;
}
bool cmp1(User a, User b) {
    if(a.total != b.total)
        return a.total > b.total;
    else if(a.cnt != b.cnt)
        return a.cnt > b.cnt;
    else
        return a.id < b.id;
}

int main(){
	int n,k,m;
	scanf("%d%d%d",&n,&k,&m);
	vector<int> perfect(k+1);
	for(int i=1;i<=k;++i){
		scanf("%d",&perfect[i]);
	}
	vector<User>v_user(n+1);
	for(int i = 1; i <= n; i++){
        v_user[i].v.resize(k + 1, -1);
	}
	int id,courseid,score;
	for(int i=0;i<m;++i){
		scanf("%d%d%d",&id,&courseid,&score);
		v_user[id].id=id;
		
		
		v_user[id].v[courseid]=max(v_user[id].v[courseid],score);
		if(score!=-1){
			v_user[id].flag=1;
		}else if(v_user[id].v[courseid]==-1){
			v_user[id].v[courseid]=-2;
		}



	}
	
	for(int i=1;i<=n;++i){
		
		for(int j=1;j<=k;++j){	
			if(v_user[i].v[j]!=-1&&v_user[i].v[j]!=-2){
				v_user[i].total+=v_user[i].v[j];	
			}
			if(v_user[i].v[j]==perfect[j]){
				v_user[i].cnt++;
			}
		}
		
	}
	
	sort(v_user.begin()+1,v_user.end(),cmp1);
	for(int i = 1; i <= n; i++) {
        v_user[i].rank = i;
        if(i != 1 && v_user[i].total == v_user[i - 1].total)
            v_user[i].rank = v_user[i - 1].rank;
    }
	
	for(int i=1;i<v_user.size();++i){
		if(v_user[i].flag==1){
			
			printf("%d %05d %d",v_user[i].rank,v_user[i].id,v_user[i].total);
			for(int j=1;j<=v_user[i].v.size()-1;++j){
				if(v_user[i].v[j]!=-1&&v_user[i].v[j]!=-2){
					printf(" %d",v_user[i].v[j]);
				}else if(v_user[i].v[j]==-1){
					printf(" -");
				}else{
					printf(" 0");
				}
			}
			printf("\n");
		}
		
	}
	return 0;
}

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦