PAT 1085 PAT单位排行(25 分)

1085 PAT单位排行(25 分)

每次 PAT 考试结束后,考试中心都会发布一个考生单位排行榜。本题就请你实现这个功能。
输入格式:
输入第一行给出一个正整数 N( 105 ≤ 10 5 ​​ ),即考生人数。随后 N 行,每行按下列格式给出一个考生的信息:

准考证号 得分 学校

其中准考证号是由 6 个字符组成的字符串,其首字母表示考试的级别:B代表乙级,A代表甲级,T代表顶级;得分是 [0, 100] 区间内的整数;学校是由不超过 6 个英文字母组成的单位码(大小写无关)。注意:题目保证每个考生的准考证号是不同的。
输出格式:
首先在一行中输出单位个数。随后按以下格式非降序输出单位的排行榜:

排名 学校 加权总分 考生人数

其中排名是该单位的排名(从 1 开始);学校是全部按小写字母输出的单位码;加权总分定义为乙级总分/1.5 + 甲级总分 + 顶级总分*1.5的整数部分;考生人数是该属于单位的考生的总人数。
学校首先按加权总分排行。如有并列,则应对应相同的排名,并按考生人数升序输出。如果仍然并列,则按单位码的字典序输出。
输入样例:

10
A57908 85 Au
B57908 54 LanX
A37487 60 au
T28374 67 CMU
T32486 24 hypu
A66734 92 cmu
B76378 71 AU
A47780 45 lanx
A72809 100 pku
A03274 45 hypu

输出样例:

5
1 cmu 192 2
1 au 192 3
3 pku 100 1
4 hypu 81 2
4 lanx 81 2




这里写图片描述

解析

solution

发现C语言好好写,在速度上是甩其他语言一大截(逃
这题如果要用C++,就用map。
如果要用C,就要好好规划程序了,我规划的程序步骤是:
①处理输入,每输入一次,就把字符串小写,成绩按BAT更正(用double存储成绩)
②按学校名字排名,方便后面做事
③把每个学校归档分配,放在一个新的数据数组里。
④把定义为double的score现在就取他的整数部分,放在定义为int的score
⑤按int的score排序
⑥输出


case

最后两个case没过,且运行时间为0,代表你的程序超时了,你要重新整理你的程序架构,让他更快,(建议分析时间复杂度)
最后一个case没过,你没有执行上面的步骤4,你是按double的成绩排序的。但是题目要求是按int的score排序,所以如果你没有步骤4,就添加上吧。
最后的case真的神奇,这都能检查出来。



刷题记录

这题大家估计都是最后两个case超时.
我估计我超时的元原因是在添加元素:我是使用自定义的find查找该考生的学校是否被记录,如果没有,则记录下这个学校。明显:这样的时间复杂度是 O(N2) O ( N 2 ) 。这就是超时的元素。怕是只能用map了。用C语言真的累,什么东西都没有。所以只能得20分
二刷记录:把思路改一改:
①输入、,把字符串小写,成绩按BAT更正
②按学校排名
③把每个学校归档分配,放在 一个新的数据数组
④输出
这样最后两个监测点是不会超时,但是我的代码最后一个监测点没有通过,(;´д`)ゞ。
三刷记录:
还是上面的思路,还修改一些地方就能通过了。



一刷:

#include<stdio.h>
#include<string.h>
#include<bits/stdc++.h>
typedef struct{
    char name[10];
    double sum;
    int size;
}school;

int find(school *a,int N,char *string){
    for(int i=0;i<N;i++){
        if(!strcmp(a[i].name,string))
            return i;
    }
    return -1;
}
bool cmp(school a,school b){
    if(a.sum >b.sum)
        return true;
    else if(a.sum == b.sum){
        if(a.size <b.size)
            return true;
        else if(a.size == b.size)
            return (strcmp(a.name,b.name)>0)?false:true;
        else
            return false;
    }
    else
        return false;
}
int main()
{
    int N;
    scanf("%d",&N);
    school* data = (school*)malloc(sizeof(school)*N);
    char temp_id[10];   
    char temp_name[10];
    double score;
    int index,j=0;
    char ch;
    for(int i=0;i<N;i++){
        scanf("%s %lf %s",temp_id,&score,temp_name);    
        int len = strlen(temp_name);    
        for(int i=0;i<len;i++)
            temp_name[i] =tolower(temp_name[i]);
        index = find(data,N,temp_name);
        if(index == -1){
            index = j++;
            strcpy(data[index].name,temp_name);
            data[index].sum=0;
            data[index].size=0;     
        }
        data[index].size++;
        switch(temp_id[0]){
            case 'A':
                data[index].sum+=score;
                break;
            case 'B':
                data[index].sum+=score/1.5;
                break;
            case 'T':
                data[index].sum+=score*1.5;
        }
    }
    std::sort(data,data+j,cmp);
    printf("%d\n",j);
    int k=1,now,sum=0;   
    for(int i=0;i<j;i++){
        now = (int) data[i].sum;
        k = (now ==sum)?k:i+1;
        sum =now;
        printf("%d %s %d %d\n",k,data[i].name,now,data[i].size);
    }

    return 0;
}




二刷

#include<stdio.h>
#include<string.h>
#include<bits/stdc++.h>
typedef struct{
    char name[10];
    double score;
    int size;
}school;

bool cmp1(school a,school b){
    return strcmp(a.name,b.name)>=0?true:false;
}
bool cmp(school a,school b){
    if(a.score >b.score)
        return true;
    else if(a.score == b.score){
        if(a.size <b.size)
            return true;
        else if(a.size == b.size)
            return (strcmp(a.name,b.name)>0)?false:true;
        else
            return false;
    }
    else
        return false;
}
int main()
{
    int N;
    scanf("%d",&N);
    school* data = (school*)malloc(sizeof(school)*N);
    char temp_id[10];
    double score;
    int len;
    for(int i=0;i<N;i++){
        scanf("%s %lf %s",temp_id,&score,(data+i)->name);
        switch(temp_id[0]){
            case 'A':
                (data+i)->score=score;
                break;
            case 'T':
                (data+i)->score=score*1.5;
                break;
            case 'B':
                (data+i)->score=score/1.5;
        }
        len = strlen((data+i)->name);
        for(int j=0;j<len;j++)
            *((data+i)->name+j) = tolower(*((data+i)->name+j));
    }
    std::sort(data,data+N,cmp1);
    school* data1 = (school*)malloc(sizeof(school)*N);
    strcpy(data1->name,data->name);
    data1->score = data->score;
    data1->size++;
    int school_size=0;
    for(int i=1;i<N;i++){
        if(strcmp((data1+school_size)->name,(data+i)->name) == 0){
            (data1+school_size)->score+=(data+i)->score;
            (data1+school_size)->size++;
        }
        else{
            school_size++;
            strcpy((data1+school_size)->name,(data+i)->name);
            (data1+school_size)->score = (data+i)->score;
            (data1+school_size)->size++;
        }
    }
    std::sort(data1,data1+school_size+1,cmp);
    printf("%d\n",school_size+1);
    int k=1,now,sum=0;   
    for(int i=0;i<school_size+1;i++){
        now = (int) data1[i].score;
        k = (now ==sum)?k:i+1;
        sum =now;
        printf("%d %s %d %d\n",k,data1[i].name,now,data1[i].size);
    }

    return 0;
}

三刷代码:

#include<stdio.h>
#include<string.h>
#include<bits/stdc++.h>
typedef struct{
    char name[10];
    double score;
    int size;
}school;
typedef struct{
    char name[10];
    double score;
    int score1;
    int size;
}school1;
bool cmp1(school a,school b){
    return strcmp(a.name,b.name)>0?true:false;
}
bool cmp(school1 a,school1 b){
    if(a.score1 >b.score1)
        return true;
    else if(a.score1 == b.score1){
        if(a.size <b.size)
            return true;
        else if(a.size == b.size)
            return (strcmp(a.name,b.name)>0)?false:true;
        else
            return false;
    }
    else
        return false;
}
school data[100001];
school1 data1[100001];
int main()
{
    int N;
    scanf("%d",&N);
    char temp_id[10];
    double score;
    int len;
    for(int i=0;i<N;i++){
        scanf("%s %lf %s",temp_id,&score,(data+i)->name);
        switch(temp_id[0]){
            case 'A':
                (data+i)->score=score;
                break;
            case 'T':
                (data+i)->score=score*1.5;
                break;
            case 'B':
                (data+i)->score=score/1.5;
        }
        len = strlen((data+i)->name);
        for(int j=0;j<len;j++)
            *((data+i)->name+j) = tolower(*((data+i)->name+j));
    }
    std::sort(data,data+N,cmp1);
    strcpy(data1->name,data->name);
    data1->score = data->score;
    data1->size++;
    int school_size=0;
    for(int i=1;i<N;i++){
        if(strcmp((data1+school_size)->name,(data+i)->name) == 0){
            (data1+school_size)->score+=(data+i)->score;
            (data1+school_size)->size++;
        }
        else{
            school_size++;
            strcpy((data1+school_size)->name,(data+i)->name);
            (data1+school_size)->score = (data+i)->score;
            (data1+school_size)->size++;
        }
    }
    for(int i=0;i<school_size+1;i++)
        (data1+i)->score1 = (int)(data1+i)->score;
    std::sort(data1,data1+school_size+1,cmp);
    printf("%d\n",school_size+1);
    int k=1,now,sum=-100;   
    for(int i=0;i<school_size+1;i++){
        now = data1[i].score1;
        k = (now ==sum)?k:i+1;
        printf("%d %s %d %d\n",k,data1[i].name,now,data1[i].size);
        sum =now;
    }

    return 0;
}
  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值