点击链接PAT乙级-AC全解汇总
题目:
PAT 准考证号由 4 部分组成:
第 1 位是级别,即 T
代表顶级;A
代表甲级;B
代表乙级;
第 2~4 位是考场编号,范围从 101 到 999;
第 5~10 位是考试日期,格式为年、月、日顺次各占 2 位;
最后 11~13 位是考生编号,范围从 000 到 999。
现给定一系列考生的准考证号和他们的成绩,请你按照要求输出各种统计信息。
输入格式:
输入首先在一行中给出两个正整数 N(≤104 )和 M(≤100),分别为考生人数和统计要求的个数。
接下来 N 行,每行给出一个考生的准考证号和其分数(在区间 [0,100] 内的整数),其间以空格分隔。
考生信息之后,再给出 M 行,每行给出一个统计要求,格式为:类型 指令,其中
-
类型
为 1 表示要求按分数非升序输出某个指定级别的考生的成绩,对应的指令
则给出代表指定级别的字母; -
类型
为 2 表示要求将某指定考场的考生人数和总分统计输出,对应的指令
则给出指定考场的编号; -
类型
为 3 表示要求将某指定日期的考生人数分考场统计输出,对应的指令
则给出指定日期,格式与准考证上日期相同。
输出格式:
对每项统计要求,首先在一行中输出Case #:
要求,其中#
是该项要求的编号,从 1 开始;要求
即复制输入给出的要求。随后输出相应的统计结果: -
类型
为 1 的指令,输出格式与输入的考生信息格式相同,即准考证号 成绩
。对于分数并列的考生,按其准考证号的字典序递增输出(题目保证无重复准考证号); -
类型
为 2 的指令,按人数 总分
的格式输出; -
类型
为 3 的指令,输出按人数非递增顺序,格式为考场编号 总人数
。若人数并列则按考场编号递增顺序输出。
如果查询结果为空,则输出NA
。
输入样例:
8 4
B123180908127 99
B102180908003 86
A112180318002 98
T107150310127 62
A107180908108 100
T123180908010 78
B112160918035 88
A107180908021 98
1 A
2 107
3 180908
2 999
输出样例:
Case 1: 1 A
A107180908108 100
A107180908021 98
A112180318002 98
Case 2: 2 107
3 260
Case 3: 3 180908
107 2
123 2
102 1
Case 4: 2 999
NA
我的AC代码:
#include<bits/stdc++.h>
using namespace std;
struct Rooms {
string room_id_;
int num_;
};
bool my_cmp_case3s(const Rooms &a, const Rooms &b) {
if(a.num_!=b.num_)return a.num_>b.num_;
else return a.room_id_<b.room_id_;
}
class Stu {
public:
Stu(string id,int score):id_(id),score_(score){};
string id_;
int score_;
};
bool my_cmp_case1(Stu &a,Stu &b){
if(a.score_!=b.score_)return a.score_>b.score_;
else return a.id_<b.id_;
}
class Room {
public:
Room(string id,int num=1):room_id_(id),num_(num){};
string room_id_;
int num_;
};
bool my_cmp_case3(Room &a,Room &b){
if(a.num_!=b.num_)return a.num_>b.num_;
else return a.room_id_<b.room_id_;
}
int main()
{
int N,M;
cin>>N>>M;
vector<Stu>all_stu;
for(int i=0;i<N;i++)
{
string id;
int score;
cin>>id>>score;
Stu t(id,score);
all_stu.push_back(t);
}
for(int i=1;i<=M;i++)
{
int choice;
cin>>choice;
if(choice==1)//准考证号 成绩
{
char c;
cin>>c;
vector<Stu>out;
for(int j=0;j<N;j++)
{
if(all_stu[j].id_[0]==c)out.push_back(all_stu[j]);
}
//输出case1
printf("Case %d: 1 %c\n",i,c);
if(out.size()==0)
{
printf("NA\n");
continue;
}
sort(out.begin(),out.end(),my_cmp_case1);
for(int j=0;j<out.size();j++)
{
printf("%s %d\n", out[j].id_.c_str(), out[j].score_);
}
}
else if(choice==2)//人数 总分
{
int cnt=0,sum=0;
string id_room;
cin>>id_room;
for(int j=0;j<N;j++)
{
if(all_stu[j].id_.substr(1,3)==id_room)
{
cnt++;
sum+=all_stu[j].score_;
}
}
//输出case2
cout<<"Case "<<i<<": 2 "<<id_room<<endl;
if(cnt==0)
{
printf("NA\n");
continue;
}
printf("%d %d\n",cnt,sum);
}
else if(choice==3)//考场编号 总人数
{
string date;
cin>>date;
vector<Rooms> out;
unordered_map<string, int> room_index;
for (int j = 0; j < N; j++)
{
if (all_stu[j].id_.substr(4, 6) == date)
room_index[all_stu[j].id_.substr(1, 3)]++;
}
for (auto it : room_index)
{
// Rooms t{it.first, it.second};
out.push_back({it.first, it.second});
}
//输出case3
cout<<"Case "<<i<<": 3 "<<date<<endl;
if(out.size()==0)
{
printf("NA\n");
continue;
}
sort(out.begin(),out.end(),my_cmp_case3s);
for (int j = 0; j < out.size(); j++)
printf("%s %d\n", out[j].room_id_.c_str(), out[j].num_);
}
}
return 0;
}
case 3 4超时代码:
#include<bits/stdc++.h>
using namespace std;
class Stu {
public:
Stu(string id,int score):id_(id),score_(score){};
string id_;
int score_;
};
bool my_cmp_case1(Stu a,Stu b)
{
if(a.score_!=b.score_)return a.score_>b.score_;
else return a.id_<b.id_;
}
class Room {
public:
Room(string id):room_id_(id),num_(1){};
string room_id_;
int num_;
};
bool my_cmp_case3(Room a,Room b)
{
if(a.num_!=b.num_)return a.num_>b.num_;
else return a.room_id_<b.room_id_;
}
int main()
{
int N,M;
cin>>N>>M;
vector<Stu>all_stu;
for(int i=0;i<N;i++)
{
string id;
int score;
cin>>id>>score;
Stu t(id,score);
all_stu.push_back(t);
}
for(int i=1;i<=M;i++)
{
int choice;
cin>>choice;
if(choice==1)//准考证号 成绩
{
char c;
cin>>c;
vector<Stu>out;
for(int j=0;j<N;j++)
{
if(all_stu[j].id_[0]==c)out.push_back(all_stu[j]);
}
//输出case1
printf("Case %d: 1 %c\n",i,c);
if(out.size()==0)
{
cout<<"NA"<<endl;
continue;
}
sort(out.begin(),out.end(),my_cmp_case1);
for(int j=0;j<out.size();j++)
{
cout<<out[j].id_<<" "<<out[j].score_<<endl;
}
}
else if(choice==2)//人数 总分
{
int cnt=0,sum=0;
string id_room;
cin>>id_room;
for(int j=0;j<N;j++)
{
if(all_stu[j].id_.substr(1,3)==id_room)
{
cnt++;
sum+=all_stu[j].score_;
}
}
//输出case2
cout<<"Case "<<i<<": 2 "<<id_room<<endl;
if(cnt==0)
{
cout<<"NA"<<endl;
continue;
}
cout<<cnt<<" "<<sum<<endl;
}
else if(choice==3)//考场编号 总人数
{
string date;
cin>>date;
int index=1;
map<string,int>room_index;
vector<Room>out;
for(int j=0;j<N;j++)
{
if(all_stu[j].id_.substr(4,6)==date)
{
string room_id=all_stu[j].id_.substr(1,3);
if(room_index[room_id]!=0)
{
out[room_index[room_id]-1].num_++;
}
else
{
Room t(room_id);
out.push_back(t);
room_index[room_id]=index++;
}
}
}
//输出case3
cout<<"Case "<<i<<": 3 "<<date<<endl;
if(index==1)
{
cout<<"NA"<<endl;
continue;
}
sort(out.begin(),out.end(),my_cmp_case3);
for(int j=0;j<out.size();j++)
{
cout<<out[j].room_id_<<" "<<out[j].num_<<endl;
}
}
}
return 0;
}
case3 4哪个时间长不一定的,而且如果用的数据结构差不多,可以多试几次能不能通过,同样的代码跑的时间也不一样~
不知道超时是不是都是201ms…
注意: 主要就是处理3的情况,用struct会快一点、用printf会快一点、看柳神说的map用unordered_map也会快一点~,总之越快越好!
开心,一个月总算把乙级刷完了,完结撒花~
甲级我来了!