【2月16日PAT刷题笔记】——1153 Decode Registration Card of PAT (25分)

人盡茶涼 提交于 2020-02-17 09:19:25

1153 Decode Registration Card of PAT (25分)

终于,经过一个多月的努力。。甲乙级的题都完成了百分之八九十左右了=_=

所以,这几天着重在处理自己过不了的题,大多是30分题,也有这样的25分题,好菜啊。。。。。。、

这就是一道排序题,但是我想复杂了,一直想的都是先预处理所有的可能 问题,然后问啥直接输出啥,但是这样不仅代码不好写,还很长,最后还是根据题解,改成了每次查询再遍历寻找。

1.当用map超时时,改用unordered_map有时可避免超时

2.c++ 的string类 也是可以用printf来进行输出的,像下面这样

#include<bits/stdc++.h>
using namespace std;
int main() {
	string s;
	cin>>s;
	printf("%s",s.c_str());
	return 0;
}

3.排序养成习惯:传参引用,这样比不传参更快

bool cmp(const node &a,const node &b) {
	if(a.score==b.score) return a.ID<b.ID;
	return a.score>b.score;
}

本题的解

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+100;
struct node {
	string ID;
	int score;
} stu[maxn];
bool cmp(const node &a,const node &b) {
	if(a.score==b.score) return a.ID<b.ID;
	return a.score>b.score;
}
int n,k,type;
int main() {
	string ques;
	cin>>n>>k;
	for(int i=0; i<n; i++) {
		cin>>stu[i].ID>>stu[i].score;
	}
	for(int i=1; i<=k; i++) {
		vector<node>ve;
		int sum=0,cnt=0;
		cin>>type>>ques;
		printf("Case %d: %d %s\n",i,type,ques.c_str());
		if(type==1) {
			for(int j=0; j<n; j++) {
				if(stu[j].ID[0]==ques[0]) ve.push_back(stu[j]);
			}

		} else if(type==2) {
			for(int j=0; j<n; j++) {
				if(stu[j].ID.substr(1,3)==ques) {
					sum+=stu[j].score;
					cnt++;
				}
			}
			if(cnt==0) printf("NA\n");
			else printf("%d %d\n",cnt,sum);
		} else {
			unordered_map<string,int>mp;
			for(int j=0; j<n; j++) {
				if(stu[j].ID.substr(4,6)==ques) {
					mp[stu[j].ID.substr(1,3)]++;
				}
			}
			for(unordered_map<string,int>::iterator it=mp.begin(); it!=mp.end(); it++) {
				ve.push_back({it->first,it->second});
			}
		}
		if(type==1||type==3) {
			if(ve.size()==0) printf("NA\n");
			else {
				sort(ve.begin(),ve.end(),cmp);
				for(int j=0; j<ve.size(); j++) printf("%s %d\n",ve[j].ID.c_str(),ve[j].score);
			}
		}
	}

	return 0;
}

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!