【倒计时12day 6/155】PAT(甲级)2018年冬季考试

PAT(甲级)2018年冬季考试


在这里插入图片描述
第一次利用完整的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&&lt){
        printf("Not Heap\n");
    }else if(gt){
        printf("Min Heap\n");
    }else{
        printf("Max Heap\n");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值