PAT1025

这道题是照着晴神的来敲,但是自己技术太渣,中间还是出现了不少问题。

1.学习到排序的做法,利用algorithm库的sort(begin,end,cmp),自己按照题目要求来完成cmp的编写

可能经常会用到cstring库的strcmp(a,b),是个好东西,a>b返回正数,==返回0,小于返回负数

2.如果排序题中的个体是有很多用于排序的私人信息的话,可以使用struct来囊括

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<algorithm>
using namespace std;
struct student{
    char rn[15]; //准考号 
    int score;  //分数 
    int ln;  //场次号
    int lr;  //本场排名 
};

student stu[30001];

bool cmp(const student &a,const student &b){
    if(a.score!=b.score) return a.score>b.score;
    else return strcmp(a.rn,b.rn)<0;  //准考号小的排在前面 
}

int main(){
    freopen("in.txt","r",stdin);
    
    int n,num=0; //n为考场的数量,num为总人数 
    scanf("%d",&n);

    for(int i=1;i!=n+1;++i){
        int k;  //本场人数 
        scanf("%d",&k);
        for(int j=0;j!=k;++j){
            scanf("%s %d",stu[num].rn,&stu[num].score);
            stu[num].ln=i;
            num++;
        }
        
        sort(stu+num-k,stu+num,cmp);  //当前场次排序
        stu[num-k].lr= 1;
        for(int j=1;j!=k;j++){
            if(stu[num-k+j].score==stu[num-k+j-1].score)
                stu[num-k+j].lr=stu[num-k+j-1].lr;
            else stu[num-k+j].lr=j+1;
        }    
    }
    printf("%d",num);
    sort(stu,stu+num,cmp);
    int r=1;
    for(int i=0;i!=num;i++){
        printf("\n");
        if(i!=0 && stu[i].score!=stu[i-1].score)
            r=i+1;
        printf("%s %d %d %d",stu[i].rn,r,stu[i].ln,stu[i].lr);
    }
    
    return 0;
}

 

posted on 2019-08-30 15:32  川川——叮叮咚咚  阅读(128)  评论(0编辑  收藏  举报