(推荐个截图神器,fireshot
win+shift+s并不好用,因为它不能截长图)
自己做的和标准答案差不多,些微不同。几个出错的点:
1.题目数量要求没看仔细,n个考场,每个考场m个考生,总人数我居然直接用m大小的数组存了。
2.打印的时候,总人数count又是忘记打了,OJ显示所有答案错误,检查了半天才发现 ( ̄▽ ̄)"
AC代码:
//A1025 PAT Ranking (25分) https://pintia.cn/problem-sets/994805342720868352/problems/994805474338127872
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
struct patest {
char sn[14];
int f_rank;
int loc;
int l_rank;
int score;
}pat[30010];//总数是3w,看清楚了,要乘一下的
bool cmp(patest p1,patest p2)
{
if (p1.score != p2.score) return p1.score > p2.score;
else {
return strcmp(p1.sn, p2.sn) < 0;
}
}
void print_ranklist(patest *p,int n)
{
printf("%d\n", n);
for (int i = 0; i < n; i++) {
printf("%s %d %d %d\n", p[i].sn, p[i].f_rank, p[i].loc, p[i].l_rank);
}
}
void init(patest *p, char* s, int score, int loc)
{
strcpy(p->sn, s);
p->score = score;
p->loc = loc;
}
int main()
{
int N, count = 0;//count为总人数计数
int left, right;
scanf("%d", &N);
for(int i=1;i<=N;i++)
{
int num;
scanf("%d", &num);
left = count;
for (int j = 0; j < num; j++) {//读取一个loc的数据
int score;
char s[14] = { 0 };
scanf("%s", s);
scanf("%d", &score);
init(pat+count, s, score, i);
count++;
}
right = count;
sort(pat + left, pat + right, cmp);
pat[left].l_rank = 1;//排序出l_rank
for (int i = left+1; i < right; i++) {
if (pat[i].score == pat[i - 1].score)
pat[i].l_rank = pat[i - 1].l_rank;
else
pat[i].l_rank = i-left+ 1;//i-left为组中下标
}
}
sort(pat, pat + count, cmp);//排序出f_rank
pat[0].f_rank = 1;
for (int i = 1; i < count; i++) {
if (pat[i].score == pat[i - 1].score)
pat[i].f_rank = pat[i - 1].f_rank;
else
pat[i].f_rank = i + 1;
}
print_ranklist(pat, count);
return 0;
}