【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;
}

浙公网安备 33010602011771号