PAT(甲级)2018年冬季考试
文章目录
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/84b178aa956a987d21fe399dbd8c567a.png)
第一次利用完整的3h做PAT题目,离考试还有12天,还是很慌的…51分
做题速度太慢
!
挑战12天做完PAT155题,今天6/155
7-1 Google Recruitment
Code
#include<iostream>
#include<stdlib.h>
#include<cmath>
#include<string.h>
using namespace std;
bool isPrime(int num){
for(int i=2;i<=sqrt(num);i++){
if(num%i==0){
return false;
}
}
return true;
}
void printf_K(int number,int K){
string res=to_string(number);
while(res.size()<K){
res="0"+res;
}
cout<<res<<endl;
}
int main(){
int N,K,number,flag=0;
cin>>N>>K;
string str,sub;
cin>>str;
for(int i=0;i<N-K+1;i++){
sub=str.substr(i,K);
number=atoi(sub.c_str());
if(isPrime(number)){
//printf("%d",number);
printf_K(number,K);
flag=1;
break;
}
}
if(flag==0){
cout<<"404";
}
return 0;
}
7-2 Decode Registration Card of PAT
AcWing 1647. 解码PAT准考证
emmm这题其实我的代码也是正确的,不知道为啥一直过不了以下为我没过的代码,求高人指点
#include<iostream>
#include<algorithm>
#include<map>
#define MaxN 10001
using namespace std;
typedef struct Node* List;
struct Node{
string cardnumber;
string level;
string rank;
string date;
string totol_score;
int score;
};
typedef struct Node2* List2;
struct Node2{
string rank;
int times;
};
struct Node* A[MaxN];
void init(string str,int score,int i){
List temp=new Node();
temp->cardnumber=str;
temp->level=str.substr(0,1);
temp->rank=str.substr(1,3);
temp->date=str.substr(4,6);
temp->totol_score=str.substr(10,3);
temp->score=score;
A[i]=temp;
}
bool cmp1(List a,List b){
if(a->score>b->score){
return true;
}else if(a->score==b->score){
if(a->rank<b->rank){
return true;
}
}
return false;
}
bool cmp2(List2 a,List2 b){
if(a->times>b->times){
return true;
}else if(a->times==b->times){
if(a->rank<b->rank){
return true;
}
}
return false;
}
void deal(int type,string term,int N){
int flag=1;
if(type==1){
sort(A,A+N,cmp1);
for(int i=0;i<N;i++){
List temp=A[i];
if(temp->level==term){
flag=0;
cout<<temp->cardnumber<<" "<<temp->score<<endl;
}
}
if(flag){
cout<<"NA"<<endl;
}
}else if(type==2){
int times=0,counts=0;
for(int i=0;i<N;i++){
List temp=A[i];
if(temp->rank==term){
flag=0;
times++;
counts+=temp->score;
}
}
if(flag){
cout<<"NA"<<endl;
}else{
cout<<times<<" "<<counts<<endl;
}
}else if(type==3){
map<string,int> mp;
for(int i=0;i<N;i++){
List temp=A[i];
if(temp->date==term){
flag=0;
mp[temp->rank]++;
}
}
if(flag){
cout<<"NA"<<endl;
}else{
map<string,int>::iterator it;
int len=mp.size(),i=0;
List2 B[len];
for(it=mp.begin();it!=mp.end();it++){
List2 t=new Node2();
t->rank=it->first;
t->times=it->second;
B[i++]=t;
}
sort(B,B+len,cmp2);
for(int i=0;i<len;i++){
cout<<B[i]->rank<<" "<<B[i]->times<<endl;
}
}
}
}
int main(){
int PNumber,QNumber;
cin>>PNumber>>QNumber;
string str;
int score;
for(int i=0;i<PNumber;i++){
cin>>str>>score;
init(str,score,i);
}
int type;
string term;
for(int j=1;j<=QNumber;j++){
cin>>type>>term;
printf("Case %d: %d ",j,type);
cout<<term<<endl;
deal(type,term,PNumber);
}
return 0;
}
注意
看完ACWING后才写出来的(y总思路)
1.sort结构体时,可以在结构体中写排序规则
struct Node{
string id;
int score;
bool operator <(const Node &k)const{
if(score>k.score){
return true;
}else if(score==k.score){
if(id<k.id){
return true;
}
}
return false;
}
}
2.printf string时,需要加.c_str()
否则会乱码
printf("%s %d\n",item.id.c_str(),item.score);
3.vector<pair<int,string>> v2;
vetcor中放入pair进行排序,先按第一key升序排序,再按第二key值升序排序
如果数值需要逆序(降序),则push进去负值进行排序
Code
#include<iostream>
#include<algorithm>
#include<vector>
#include<unordered_map>
#define MaxN 10001
using namespace std;
struct Node{
string id;
int score;
bool operator <(const Node &k)const{
if(score>k.score){
return true;
}else if(score==k.score){
if(id<k.id){
return true;
}
}
return false;
}
}A[MaxN];
void deal(int type,string term,int N){
int flag=1;
if(type==1){
vector<Node> v1;
for(int i=0;i<N;i++){
if(A[i].id.substr(0,1)==term){
v1.push_back(A[i]);
}
}
sort(v1.begin(),v1.end());
if(v1.empty()){
printf("NA\n");
}else{
for(auto item:v1){
printf("%s %d\n",item.id.c_str(),item.score);
}
}
}else if(type==2){
int times=0,counts=0;
for(int i=0;i<N;i++){
Node temp=A[i];
if(temp.id.substr(1,3)==term){
flag=0;
times++;
counts+=temp.score;
}
}
if(flag){
printf("NA\n");
}else{
printf("%d %d\n",times,counts);
}
}else if(type==3){
unordered_map<string,int> mp;
for(int i=0;i<N;i++){
Node temp=A[i];
if(temp.id.substr(4,6)==term){
flag=0;
mp[temp.id.substr(1,3)]++;
}
}
vector<pair<int,string>> v2;//vetcor中放入pair进行排序,先按第一key升序排序,再按第二key值生序排序
for(auto item:mp){
v2.push_back({-item.second,item.first});
}
sort(v2.begin(),v2.end());
if(v2.empty()){
printf("NA\n");
}else{
for(auto i:v2){
printf("%s %d\n",i.second.c_str(),-i.first);
}
}
}
}
int main(){
int PNumber,QNumber;
cin>>PNumber>>QNumber;
for(int i=0;i<PNumber;i++){
cin>>A[i].id>>A[i].score;
}
int type;
string term;
for(int j=1;j<=QNumber;j++){
cin>>type>>term;
printf("Case %d: %d %s\n",j,type,term.c_str());
deal(type,term,PNumber);
}
return 0;
}
7-3 Vertex Coloring
AcWing 1648. 顶点着色
原来的代码:
#include<iostream>
#include<algorithm>
#define MaxN 10001
#define INIFITE 10000001
using namespace std;
int G[MaxN][MaxN];
int N,M,K;
bool isOk(int color[],int N){
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
if(i!=j&&G[i][j]==-1&&color[i]==color[j]){//i到j有边
return false;
}
}
}
return true;
}
int main(){
cin>>N>>M;
int color[N];
for(int i=0;i<N;i++){
color[i]=-1;//没有颜色
for(int j=0;j<N;j++){
G[i][j]=INIFITE;
}
}
int v1,v2,c;
for(int i=0;i<M;i++){
cin>>v1>>v2;
G[v1][v2]=G[v2][v1]=-1;//有边表示为-1
}
cin>>K;
for(int i=0;i<K;i++){
for(int t=0;t<N;t++){
cin>>c;
color[t]=c;
}
if(isOk(color,N)){
sort(color,color+N);
int cnt=1;
for(int k=1;k<N;k++){
if(color[k]!=color[k-1]){
cnt++;
}
}
printf("%d-coloring\n",cnt);
}else{
cout<<"No"<<endl;
}
}
return 0;
}
超时了,因为用了传统的G[][],二维数组存储边,浪费了很大的空间,这题巧妙的方法就是利用结构体存储边,直接查看这两条边的color一不一致就可以判断出来(y总nb,我是sb)
Code
#include<iostream>
#include<algorithm>
#include<unordered_set>
#define MaxN 10001
#define INIFITE 10000001
using namespace std;
struct EdgeNode{
int a,b;
}Edge[MaxN];
int N,M,K;
int main(){
cin>>N>>M;
int color[N];
for(int i=0;i<N;i++){
color[i]=-1;//没有颜色
}
for(int i=0;i<M;i++){
scanf("%d %d",&Edge[i].a,&Edge[i].b);
}
cin>>K;
int c;
for(int i=0;i<K;i++){
for(int t=0;t<N;t++){
cin>>c;
color[t]=c;
}
bool flag=true;
for(int j=0;j<M;j++){
if(color[Edge[j].a]==color[Edge[j].b]){
flag=false;
}
}
if(flag){
unordered_set<int> S;
for(int i=0;i<N;i++){
S.insert(color[i]);
}
printf("%d-coloring\n",S.size());
}else{
printf("No\n");
}
}
return 0;
}
7-4 Heap Paths
AcWing 1649. 堆路径
思路/注意
1.dfs的路径回退
2.先dfs右孩子,再dfs左孩子
3.利用bool gt,lt来判断是否MinHeap,MaxHeap
Code
#include<iostream>
#include<vector>
#define MaxN 1010
using namespace std;
int N;
int H[MaxN];
vector<int> path;
bool gt=false,lt=false;
void dfs(int u){
path.push_back(H[u]);
if(2*u>N){//叶子结点
printf("%d",path[0]);
for(int i=1;i<path.size();i++){
printf(" %d",path[i]);
if(path[i]>path[i-1]){
gt=true;
}else if(path[i]<path[i-1]){
lt=true;
}
}
printf("\n");
}
if(2*u+1<=N){
dfs(2*u+1);//先遍历右孩子
}
if(2*u<=N){
dfs(2*u);
}
path.pop_back();//回退
}
int main(){
scanf("%d",&N);
for(int i=1;i<=N;i++){
scanf("%d",&H[i]);
}
dfs(1);
if(gt&<){
printf("Not Heap\n");
}else if(gt){
printf("Min Heap\n");
}else{
printf("Max Heap\n");
}
return 0;
}