1095 解码PAT准考证 (25 分)
链接: 1095 解码PAT准考证 (25 分)
来源:PTA程序设计类实验辅助教学平台
题目的有些长,第一眼看上去有点烦,但是慢慢读完题,发现问题还是比较好理解的,毕竟是乙级,但是作为95道的最后一道,我真的,WA了很多很多次…
这道题需要注意一下的就是时间卡着呢,用map或者全用cin、cout的话那就很容易超时,我试过很多优化cin和cout的,都无济于事,还是超时,最后还是换成了scanf和printf,其他就没什么好说的,按照题意模拟,具体解释写在代码里了
#include <iostream>
#include <cstring>
#include <unordered_map>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
typedef pair<string, int> PII;//我比较喜欢用pair来存两个数,当然,开结构体也是一样的
const int N = 1e4 + 10;
PII que[N];
int n, m, cn;
unordered_map<string, int> mp;//用map会超时,用unordered_map就行了
vector<PII> v;//vector临时存当前情况的数据
bool cmp(PII a, PII b)//自定义排序,第一种情况和第三种情况的排序都适用,都是先降序排后者,再升序排前者
{
if (a.second == b.second)
return a.first < b.first;
else
return a.second > b.second;
}
int main()
{
cin >> n >> m;
string str;
for (int i = 1; i <= n; i++)
{
cin >> que[i].first;
scanf("%d", &que[i].second);
}
for (int i = 1; i <= m; i++)
{
mp.clear();//先清空一下上次操作临时存的数据
v.clear();//先清空一下上次操作临时存的数据
scanf("%d", &cn);
cin >> str;
printf("Case %d: %d ", i, cn);
cout << str << endl;
if (cn == 1)
{
for (int j = 1; j <= n; j++)
{
if (que[j].first[0] == str[0])
//找到所以和给出的字符匹配的放入v
v.push_back({que[j].first, que[j].second});
}
if (v.size())
{
sort(v.begin(), v.end(), cmp);
for (auto l : v)//排序后输出
{
cout << l.first;
printf(" %d\n", l.second);
}
}
else
printf("NA\n");
}
else if (cn == 2)
{
int cnt = 0, sum = 0;
for (int j = 1; j <= n; j++)
{
if (que[j].first.substr(1, 3) == str)
//如何准考证号从下标1开始长度为3的子集等于str,那
//就cnt++,并将分数加入sum
{
cnt++, sum += que[j].second;
}
}
if (cnt)
printf("%d %d\n", cnt, sum);
else
printf("NA\n");
}
else if (cn == 3)
{
for (int j = 1; j <= n; j++)
{
if (que[j].first.substr(4, 6) == str)
//如何准考证号从下标4开始长度为6的子集等于str,那就将这
//个号的从1开始长度为3的子集作为key,初始value为0,对其进
//行++操作表示当初这个教室的人数+1
{
mp[que[j].first.substr(1, 3)]++;
}
}
for (auto l : mp)
//放入vector中进行自定义排序,因为不会自定义map排序...
{
v.push_back({l.first, l.second});
}
if (v.size())
{
sort(v.begin(), v.end(), cmp);//排序后输出即可
for (auto l : v)
{
cout << l.first;
printf(" %d\n", l.second);
}
}
else
printf("NA\n");
}
}
return 0;
}
还是那一句话,学好STL,我辈义不容辞,虽然也有很多人说STL不好用,但是我作为小蒟蒻,看不到那么深的层次