A1025 PAT Ranking (25)

版权声明:如需转载请联系[email protected] https://blog.csdn.net/qq_20633793/article/details/82114919

思路:
两次排序,一次本地名次,一次总名次,但是没有必要存储两个序列,sort函数可以对特定区间排序,再对整体排序sort(it_lo,it_hi)
笔者第一次做的时候直接将数据存储了多个数组分别排序,每个数据存储了两边,浪费了空间,但是写法上较简单,不用考虑分段排序的下标

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
//1025 PAT Ranking (25)
struct node{
    long long id;
    int score,localnum,localrank,rank;
    node(long long ii,int ss,int ll):id(ii),score(ss),localnum(ll){}
    bool operator<(node& b){
        return score>b.score||(score==b.score&&id<b.id);
    }
};
int main(){
    //freopen("D:\\input.txt","r",stdin);
    int N,K;
    scanf("%d",&N);
    vector<vector<node>> stu(N+1);//stu[i]表示第i个地区的学生信息
    vector<int> num(N+1);//num[i]表示第i个地区的学生数量
    int sum=0;//学生总数
    long long id;
    int score;
    vector<node> ans;
    for(int i=1;i<=N;i++){
        scanf("%d",&num[i]);
        sum+=num[i];
        for(int j=0;j<num[i];j++){
            scanf("%lld %d",&id,&score);
            stu[i].push_back(node(id,score,i));
            ans.push_back(stu[i][j]);
        }
        sort(stu[i].begin(),stu[i].end());
        stu[i][0].localrank=1;
        for(int j=1;j<num[i];j++){
            if(stu[i][j].score==stu[i][j-1].score)
                stu[i][j].localrank=stu[i][j-1].localrank;
            else
                stu[i][j].localrank=j+1;
        }
    }

    sort(ans.begin(),ans.end());
    ans[0].rank=1;
    for(int i=1;i<sum;i++){
        if(ans[i].score==ans[i-1].score)
            ans[i].rank=ans[i-1].rank;
        else ans[i].rank=i+1;
    }
    printf("%d\n",sum);
    for(int i=0;i<sum;i++)
        printf("%013lld %d %d %d\n",ans[i].id,ans[i].rank,ans[i].localnum,ans[i].localrank);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_20633793/article/details/82114919
今日推荐