先上代码,C++
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
struct student {
char id[13];
int local;
int score;
int local_r;
int r;
}stu[30010];
bool cmp(student a, student b) {
if (a.score != b.score) return a.score > b.score;
else return strcmp(a.id, b.id) < 0;
}
int main()
{
int local_num, num = 0, k;
int i, j;
cin >> local_num;
for (j = 1; j <= local_num; j++) {
cin >> k;
for (i = 0; i < k; i++) {
scanf("%s %d", stu[num].id, &stu[num].score);
stu[num].local = j;
num++;
}
sort(stu + num - k, stu + num, cmp);
stu[num - k].local_r = 1;
for (i = num - k + 1; i < num; i++) {
if (stu[i].score == stu[i - 1].score) stu[i].local_r = stu[i - 1].local_r;
else stu[i].local_r = i + 1 - (num - k);
}
}
sort(stu, stu + num, cmp);
stu[0].r = 1;
for (i = 1; i < num; i++) {
if (stu[i].score == stu[i - 1].score) stu[i].r = stu[i - 1].r;
else stu[i].r = i + 1;
}
printf("%d\n", num);
for (i = 0; i < num; i++) {
printf("%s ", stu[i].id);
printf("%d %d %d\n", stu[i].r, stu[i].local, stu[i].local_r);
}
return 0;
system("pause");
}
其实这种排序不难的,关键是思路清晰,然后细心点(比如有一段我copy时没有把local_r改成score,什么鬼,耽搁了好久,大家不要这么马虎鸭)。
总结一下解题过程中我遇到的困难吧:
1、数组范围设置好,要满足题意的最大数据量。
2、我用的是VS,过程中出现了以下报错:
严重性代码说明项目文件行 禁止显示状态错误 C4996 fopen('fscanf'、strcmp):This function or variable may be unsafe.?
那么如何解决呢?网上参考方法有很多,但我参考的解决方法是:
无需在程序最前面加那行代码,只需在新建项目时取消勾选“SDL检查”即可,若项目已建立好,在项目属性里关闭SDL也行。
亲测有效。
okk,今儿就这吧,下次见!
|