1025. PAT Ranking

Direct Link

#include <iostream>
#include <vector>
#include <string>
#include <cstdio>
#include <map>
#include <algorithm>
using namespace std;

struct stu
{
    string ID;
    int grade;
}tmpStu;

struct rank_e
{
    string ID;
    int final_rank;
    int local_number;
    int local_rank;
}tmpRank;

vector<stu> localInfo;
vector<stu> allInfo;
vector<rank_e> RankInfo;
map<string , int> Hash;

int cmp1(const stu &a, const stu &b)
{
    return a.grade > b.grade;
}

int cmp2(const rank_e &a, const rank_e &b)
{
    if(a.final_rank == b.final_rank)
        return a.ID < b.ID;
    return a.final_rank < b.final_rank;
}

int main()
{
    int t,group,i,n,curGrade,curRank;
    cin >> group;
    for(t = 1; t <= group; t++)
    {
        cin >> n;
        for(i = 0; i < n; i++)
        {
            cin >> tmpStu.ID >> tmpStu.grade;
            localInfo.push_back(tmpStu);
            allInfo.push_back(tmpStu);
            tmpRank.ID = tmpStu.ID;
            tmpRank.local_number = t;
            RankInfo.push_back(tmpRank);
            Hash[tmpRank.ID] = RankInfo.size()-1;
        }

        sort(localInfo.begin(), localInfo.end(), cmp1);
        curGrade = -1;
        curRank = 1;
        for(i = 0; i < localInfo.size(); i++)
        {
            if(curGrade == localInfo[i].grade)
            {
                RankInfo[ Hash[localInfo[i].ID] ].local_rank = RankInfo[ Hash[localInfo[i-1].ID] ].local_rank;
            }
            else
            {
                RankInfo[ Hash[localInfo[i].ID] ].local_rank = curRank;
                curGrade = localInfo[i].grade;
            }
            curRank++;
        }
        localInfo.clear();
    }
    sort(allInfo.begin(), allInfo.end(), cmp1);
    curGrade = -1;
    curRank = 1;
    for(i = 0; i < allInfo.size(); i++)
    {
        if(curGrade == allInfo[i].grade)
        {
            RankInfo[ Hash[allInfo[i].ID] ].final_rank = RankInfo[ Hash[allInfo[i-1].ID] ].final_rank;
        }
        else
        {
            RankInfo[ Hash[allInfo[i].ID] ].final_rank = curRank;
            curGrade = allInfo[i].grade;
        }
        curRank++;
    }
    sort(RankInfo.begin(), RankInfo.end(), cmp2);
    cout << RankInfo.size() << endl;
    for(int i = 0; i < RankInfo.size(); i++)
    {
        cout << RankInfo[i].ID << " "
             << RankInfo[i].final_rank << " "
             << RankInfo[i].local_number << " "
             << RankInfo[i].local_rank << endl;
    }

    return 0;
}