码迷,mamicode.com
首页 > 其他好文 > 详细

PTA乙级 (*1095 解码PAT准考证 (25分))

时间:2020-02-06 01:36:50      阅读:65      评论:0      收藏:0      [点我收藏+]

标签:tail   ace   value   +=   16px   end   struct   using   sort   

1095 解码PAT准考证 (25分)

https://pintia.cn/problem-sets/994805260223102976/problems/1071786104348536832

题目大意:给出一组学生的准考证号和成绩,准考证号包含了等级(乙甲顶),考场号,日期,和个人编号信息,并有三种查询方式
查询一:给出考试等级,找出该等级的考生,按照成绩降序,准考证升序排序
查询二:给出考场号,统计该考场的考生数量和总得分
查询三:给出考试日期,查询改日期下所有考场的考试人数,按照人数降序,考场号升序排序
分析:先把所有考生的准考证和分数记录下来
1.按照等级查询,枚举选取匹配的学生,然后排序即可
2.按照考场查询,枚举选取匹配的学生,然后计数、求和
3.按日期查询每个考场人数,用unordered_map存储,最后排序汇总
注意:1.第三个用map存储会超时,用unordered_map就不会超时
        2.排序传参建议用引用传参,这样更快

#include <iostream>
#include <algorithm>
#include <vector>
#include <unordered_map>
using namespace std;
struct node{
	string t;
	int value;
};
bool cmp(const node &a,const node &b)
{
	return a.value!=b.value?a.value>b.value:a.t<b.t;
}
int main()
{
	int n,m,num;
	string s;
	cin>>n>>m;
	vector<node> vec(n);
	for(int i=0;i<n;i++) cin>>vec[i].t>>vec[i].value;
	for(int i=1;i<=m;i++)
	{
		cin>>num>>s;
		printf("Case %d: %d %s\n",i,num,s.c_str());
		vector<node> ans;
		int cnt=0,sum=0;
		if(num==1){
			for(int j=0;j<n;j++)
			   if(vec[j].t[0]==s[0]) ans.push_back(vec[j]); 
		}else if(num==2){
			for(int j=0;j<n;j++)
			if(vec[j].t.substr(1,3)==s){
				cnt++;
				sum+=vec[j].value;
			}
			if(cnt!=0) printf("%d %d\n",cnt,sum); 
		}else if(num==3){
			unordered_map<string,int> mp;
			for(int j=0;j<n;j++)
			   if(vec[j].t.substr(4,6)==s) mp[vec[j].t.substr(1,3)]++;
			for(auto it:mp) ans.push_back({it.first,it.second});   
		}
		sort(ans.begin(),ans.end(),cmp);
		for(int j=0;j<ans.size();j++) printf("%s %d\n",ans[j].t.c_str(),ans[j].value);
		if((num==1||num==3)&&ans.size()==0||(num==2&&cnt==0)) printf("NA\n");
	} 
	return 0;
}

 

值得注意的是:

map本身默认对key排序,但我们不需要。

我们想对map的value排序。故实际代码中用unordered_map,它是非排序版,比map快许多。

 

对map(或unordered_map)的value排序:

 

把map的key & value存到vector中,用sort对vector排序,这种方法一定要学会。

注:mp是map,ans是vector。

for(auto it : mp)
        ans.push_back({it.first, it.second});
sort(ans.begin(), ans.end(), cmp);  

参考:https://blog.csdn.net/liuchuo/article/details/84972869

PTA乙级 (*1095 解码PAT准考证 (25分))

标签:tail   ace   value   +=   16px   end   struct   using   sort   

原文地址:https://www.cnblogs.com/jianqiao123/p/12267257.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!