题目链接
题目分析
解题思路
顺序存入数组,结构体排序即可。
AC程序(C++)
/**************************
//@Author: 3stone
//@ACM: PAT-A1025.PAT Ranking
//@Time: 2018/1/26
//@IDE: VS2017
***************************/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#define maxSize 30010
using namespace std;
typedef struct {
string id;
int score;
int final_rank, local_rank;
int local_num; //考点号
}Stu;
bool cmp(Stu s1, Stu s2) {
if (s1.score != s2.score) return s1.score > s2.score;
else return s1.id < s2.id;
}
Stu stu[maxSize];
int main() {
int n, k, sum = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &k);
int low = sum, hign, rank = 1;
for (int j = 0; j < k; j++) {
char tempStr[30];
scanf("%s %d", tempStr, &stu[sum].score);
stu[sum].id = tempStr;
stu[sum].local_num = i + 1;
hign = ++sum;
}
//赋本地名次
sort(stu + low, stu + hign, cmp);
stu[low].local_rank = 1;
for (int j = low + 1; j < hign; j++) {
if (stu[j].score != stu[j - 1].score)
rank = j - low + 1;
stu[j].local_rank = rank;
}
}
sort(stu, stu + sum, cmp);
stu[0].final_rank = 1;
int fRank = 1;
for (int j = 1; j < sum; j++) {
if (stu[j].score != stu[j - 1].score)
fRank = j + 1;
stu[j].final_rank = fRank;
}
printf("%d\n", sum);
for (int j = 0; j < sum; j++) {
printf("%s %d %d %d\n", stu[j].id.c_str(), stu[j].final_rank,
stu[j].local_num, stu[j].local_rank);
}
system("pause");
return 0;
}