算法笔记刷题5(PAT A1025)

第一次上手PAT的甲级题目,瑟瑟发抖(英语不好对着题目愣了半天)

这一题的要点是使用sort函数。

使用sort函数必须使用

#include <algorithm>
using namespace std;

一开始我是准备在结构体内同时储存局部排名和总体排名的,但是书上的做法空间复杂度比我的好多了:

只需要在结构体内存储局部排名,在最后输出时生成具体排名,而且还解决了困扰我的名次相同的问题。

还是对sort函数不是非常熟悉,所以适应的时间长了点。

#include <cstdio>
#include <algorithm>
using namespace std;
struct student{
    char id[15];//超过int的表示范围 
    int location;
    int score;
    int rank;
}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 N,K,num=0;//考场数量,每个考场人数,考生总人数 
    scanf("%d",&N);
    for(int i=0;i<N;i++){
        scanf("%d",&K);
        for(int j=0;j<K;j++){
            scanf("%s %d",stu[num].id,&stu[num].score);
            stu[num].location=i;
            num++;    
        }
        sort(stu+num-K,stu+num,cmp);//对该考场的考生排序 
        stu[num-K].rank=1;
        for(int j=num-K+1;j<num;j++){
            if(stu[j].score==stu[j-1].score){
                stu[j].rank=stu[j-1].rank;
            }else {
                stu[j].rank=j+1-(num-K);
            }
        }
    } 
    printf("%d
",num);
    sort(stu,stu+num,cmp);
    int r=1;
    for(int i=0;i<num;i++){
        if(i>0&&stu[i].score!=stu[i-1].score){
            r=i+1;
        }
        printf("%s ",stu[i].id);
        printf("%d %d %d
",r,stu[i].location+1,stu[i].rank);
    } 
    return 0;
}
原文地址:https://www.cnblogs.com/yiyefuyou/p/12457065.html