【PTA-A】1075 PAT Judge

题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805393241260032

本来以为是一道挺简单的题,但是做了才发现细节和坑点太多了。先说一下我的思路再总结一下坑点。

思路:

定义结构体,包含序号id、每道题分数score[6]={-2,-2,-2,-2,-2,-2}、是否输出flag(1或0)、分数总和sum、排名paiming、完美解题数per。

cmp函数:先flag从大到小,然后总分从大到小,再比较完美解题数从大到小、最后序号(id)从小到大【flag的顺序可以调整,其他三个不行】

步骤:

1.输入人数、题目、总提交次数,存储各题的满分。

2.输入序号题目和分数。如果本次提交的分数大于原本存储,就覆盖【坑1】。如果分数等于满分,完美解题数+1【坑2】。

3.计算分数并标识要不要输出【坑3】

4.排序【坑4】

5.存储排名【坑5】

6.输出,如果没有提交要输出"-",提交了但没通过输出"0"。【坑6】

坑点

就根据我上面标记的顺序来总结

1.要进行和原本存储的比较判断,不然可能这次提交20分,下次提交10分,应该取高的20,但被直接错误覆盖成10了

2.这个关系到最后一个测试点,考虑到有人满分后又提交满分答案的情况,不能累加完美解题数。因此除了判断是不是满分以外,还要判断原本存储的分数是不是满分,如果是,就不增加完美解题数

3.这里0分的也要标志成flag=1。虽然和不变,但是此同学满足输出条件【有编译通过的题解,即使只有0分】。

4.排序就是前面cmp函数写的那样,要有顺序

5.同分的排名并列,但是之后的排名要算上前面的人数。也就排名应该是1 2 2 2 5,不能是1 2 2 2 3。

6.因为我初始化定义的成绩都是-2,所以成绩输出比较简单,>=0的时候直接输出数字,=-1的时候输出“0”,代表输出了没通过,=-2输出“-”,代表没提交过

#include<iostream>
#include<algorithm>
using namespace std;
struct Node {
	int id = 0;
	int score[6] = { -2,-2,-2,-2,-2,-2 };
	int sum = 0;
	int paiming;
	int per = 0;
	int flag = 0;
}a[100001];

//sum从大到小、per从大到小、序号从小到大
bool cmp(Node x, Node y) {
	if (x.flag != y.flag)return x.flag > y.flag;
	else if (x.sum != y.sum)return x.sum > y.sum;
	else if (x.per != y.per)return x.per > y.per;
	else return x.id < y.id;
}

int main() {
	int temp[6] = { 0 };
	int p, ti, t;
	int x, y, z;
	cin >> p >> ti >> t;
	for (int i = 1; i <= ti; i++)cin >> temp[i];
	for (int i = 0; i < t; i++) {
		cin >> x >> y >> z;
		//满分则完美解答数+1
		if (z == temp[y] && a[x].score[y] != temp[y])a[x].per++;
		if (z > a[x].score[y])a[x].score[y] = z;
	}
	for (int i = 1; i <= p; i++) {
		//记录一下id
		a[i].id = i;
		for (int j = 1; j <= ti; j++) {
			//等于0的时候也标记,虽然和没变但需要输出
			if (a[i].score[j] >= 0) {
				a[i].sum += a[i].score[j];
				a[i].flag = 1;
			}
		}
	}
	sort(a, a + p + 1, cmp);
	a[0].paiming = 1;
	//排名
	int ci = 1;
	for (int i = 1; i < p; i++) {
		if (a[i].sum == a[i - 1].sum) {
			a[i].paiming = a[i - 1].paiming;
			ci++;
		}
		else a[i].paiming = ++ci;
	}

	//输出,注意空格
	for (int i = 0; i < p; i++) {
		if (a[i].flag) {
			cout << a[i].paiming << " ";
			printf("%05d ", a[i].id);
			cout << a[i].sum;
			//编译不通过输出0,没有提交过输出-
			for (int j = 1; j <= ti; j++) {
				if (a[i].score[j] >= 0)cout << " " << a[i].score[j];
				else if (a[i].score[j] == -2)cout << " -";
				else if (a[i].score[j] == -1)cout << " 0";
			}
			cout << endl;
		}
		else break;
	}
	return 0;
}

 

posted @ 2019-10-01 19:05  大帅本帅  阅读(23)  评论(0)    收藏  举报