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;
}
来源:CSDN
作者:哈拉泽空
链接:https://blog.csdn.net/weixin_43727229/article/details/104341134