PTA刷题Basic篇——1095.解码PAT准考证号——Day(33)

有点激动,终于把PAT乙级的95道题都刷完了,可以着手刷甲级的题目了。刷题之路永远不能停,即使你已经工作了,考上研究生了。每天都必须要保证自己的刷题量,这才叫程序员。

问题描述

在这里插入图片描述
在这里插入图片描述
按照类型1,2,3的要求输出相应的考生信息。

题目分析

这道题目我经历了很多次超时,后来借鉴了一下别人的思路,发现可以使用一种新的STL容器——unordered_map,它的底层和map完全不一样。map的底层是一个红黑树,自动维持平衡,并且有序,但是数据查找效率低;而unordered_map的底层是哈希表,所以它的查找效率很高,但是无序。
但是unordered_map由于底层是哈希,所以还是存储空间扎占用更大的,但是效率高。所以这道题我们干脆就以空间换时间,用unordered_map.所以我也只在我的代码中改了一下这个容器类型,其他的都没改就直接AC了,所以我的思路一定没问题,在这里说一下。
首先就是创建一个结构体,结构体的成员报告输入的考生信息和得分。建立一个以此结构体为类型的vector数组,然后依次输入即可。
在判断某种类型时,我们采用string的substr函数来与输入的标准进行比较,看二者是否相等。如果相等执行对应类型的操作即可。
着重说一下类型3,我们创建一个索引为string类型,value为int类型的pair,写一个函数对其进行如类型3要求的排序。string就是我们的考场编号,而int就是该考场的考生数目。所以我们在输入的时候会将unordered_map填满,然后创建一个vector数组,类型为pair<string,int>,用unordered_map将这个数组填满,将数组按照类型3排序(只不过排的是vector内部pair),遍历数组输出即可。
有很多细节没说,都是容易处理的细节,大家可以直接看代码。

代码

#include <cstdio>
#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>//注意点
#include <algorithm>
using namespace std;
typedef pair<string, int> PAIR;
struct stu
{
    string inf;
    int score;
}test[10000], temp[10000];
bool compare1(stu& a, stu& b)
{
    return a.score != b.score ? a.score > b.score : a.inf < b.inf;
}
bool compare2(PAIR& a, PAIR& b)
{
    return a.second != b.second ? a.second > b.second : a.first < b.first;
}
int main()
{
    int N, M;
    int i, j, k;
    scanf("%d%d", &N, &M);
    for(i = 0; i < N; i++) cin >> test[i].inf >> test[i].score;
    int dir;
    string range;
    int num, sscore;
    for(i = 0; i < M; i++)
    {
        cin >> dir >> range;
        printf("Case %d: %d %s\n", i + 1, dir, range.c_str());//注意点②
        if(dir == 1)//question1
        {
            for(j = 0, k = 0; j < N; j++)
                if(test[j].inf[0] == range[0])
                    temp[k++] = test[j];
            if(!k) printf("NA\n");
            else
            {
                sort(temp, temp + k, compare1);
                for(j = 0; j < k; j++) printf("%s %d\n", temp[j].inf.c_str(), temp[j].score);
            }
        }
        else if(dir == 2)//question 2
        {
            num = 0;
            sscore = 0;
            for(j = 0; j < N; j++)
                if(test[j].inf.substr(1, 3) == range)
                    num++, sscore += test[j].score;
            if(!num) printf("NA\n");
            else printf("%d %d\n", num, sscore);
        }
        else//question 3
        {
            unordered_map<string, int> m;
            for(j = 0; j < N; j++)
                if(test[j].inf.substr(4, 6) == range)//if this is the date we need
                    m[test[j].inf.substr(1, 3)]++;//increase the number of the certain classroom
            vector<PAIR> vec(m.begin(), m.end());
            if(!vec.size()) printf("NA\n");
            else
            {
                sort(vec.begin(), vec.end(), compare2);
                for(j = 0; j < vec.size(); j++) printf("%s %d\n", vec[j].first.c_str(), vec[j].second);
            }
        }
    }
    return 0;
}

答题用时21min
Q95——finish√
PAT乙级——finish√
各位加油,我开始甲级去了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值