有点激动,终于把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√
各位加油,我开始甲级去了。