【ACM】PAT. A1025 PAT Ranking 【排序】

题目链接
题目分析
解题思路

顺序存入数组,结构体排序即可。


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

猜你喜欢

转载自blog.csdn.net/qq_26398495/article/details/80722478