• 2021PAT春季甲级


    第一题 7-1 Arithmetic Progression of Primes (20 分)

    • 未加优化
    #include <iostream>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int N = 100010;
    bool primer[N];
    int n,p;
    void sushu() {
    	fill(primer,primer+p+1,true);
    	primer[0]=primer[1]=false;
    	for(int i=2;i<=p;++i) {
            if(primer[i]==false) continue;
    		for(int j=i*2;j<=p;j+=i) {
    			primer[j]=false;
    		}
    	}
    }
    bool check(int a, int b) {
        int cnt=0;
        while(primer[a]) {
            ++cnt;
            if(cnt==n) return true;
            a-=b;
            if(a<0) break;
        }
        return false;
    }
    int main() {
    	scanf("%d %d",&n,&p);
    	sushu();
    	if(n==1) {
    		int res=n;
            for(int i=p;i>1;--i) {
                if(primer[i]) {
                    res=i;
                    break;
                }
            }
            printf("%d",res);
            return 0;
    	}
        int d=p/(n-1);
        int x=-1,y=-1;
        bool flag=false;
        for(int j=d;j>=1;--j) {
            for(int i=p;i>=j*(n-1)+2;--i) {
            	if(primer[i]==false) continue;
                if(check(i,j)) {
                    x=i;
                    y=j;
                    flag=true;
                    break;
                }
            }
            if(flag) break;
        }
        if(flag) {
            for(int i=x-(n-1)*y;i<=x;i+=y) {
                printf("%d",i);
                if(i!=x) printf(" ");
            }
        } else {
            int res=n;
            for(int i=p;i>1;--i) {
                if(primer[i]) {
                    res=i;
                    break;
                }
            }
            printf("%d",res);
        }
    	return 0;
    }
    

    • 稍加优化
    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <vector>
    using namespace std;
    const int N = 100005;
    int n,p;
    int len;
    bool isprimer[N];
    vector<int> primer,res;
    void prime() {
        fill(isprimer,isprimer+p+1,true);
        isprimer[0]=isprimer[1]=false;
        for(int i=2;i<=p;++i) {
            if(isprimer[i]) {
                int j=i*2;
                while(j<=p) isprimer[j]=false,j+=i;
                primer.push_back(i);
            }
        }
        return;
    }
    int main() {
        scanf("%d %d",&n,&p);
        prime();
        len=primer.size();
        if(n==1) {
            printf("%d",primer[len-1]);
            return 0;
        }
        int d=p/(n-1);
        for(int j=d;j>=1;--j) {
            for(int i=len-1;i>=0&&primer[i]>=(n-1)*j+2;--i) {
                res.clear();
                for(int k=n-1;k>=0;--k) {
                    if(isprimer[primer[i]-k*j]) {
                        res.push_back(primer[i]-k*j);
                    } else break;
                }
                if(res.size()==n) break;
            }
            if(res.size()==n) break;
        }
        if(res.size()==n) {
            for(int i=0;i<n;++i) {
                printf("%d",res[i]);
                if(i!=n-1) printf(" ");
            }
        } else printf("%d",primer[len-1]);
        return 0;
    }
    

    第二题 7-2 Lab Access Scheduling (25 分)

    #include <iostream>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    const int N = 2005;
    struct node {
        int st,ed;
    };
    node ans[N];
    int n,hh,mm,ss;
    bool cmp(node &a, node &b) {
        if(a.st!=b.st) return a.st<b.st;
        return a.ed<b.ed;
    }
    int main() {
        scanf("%d",&n);
        for(int i=0;i<n;++i) {
            scanf("%d:%d:%d",&hh,&mm,&ss);
            ans[i].st=hh*3600+mm*60+ss;
            scanf("%d:%d:%d",&hh,&mm,&ss);
            ans[i].ed=hh*3600+mm*60+ss;
        }
        sort(ans,ans+n,cmp);
        int res=1,pos=0;
        for(int i=1;i<n;++i) {
            if(ans[i].st>=ans[pos].ed) ++res,pos=i;
            else {
                if(ans[i].ed<=ans[pos].ed) pos=i;
            }
        }
        cout<<res;
        return 0;
    }
    

    第三题 7-3 Structure of Max-Heap (25 分)

    #include <iostream>
    #include <cstring>
    #include <cmath>
    #include <string>
    #include <algorithm>
    #include <map>
    #include <unordered_map>
    using namespace std;
    const int N = 10005;
    int n,m,a,b;
    string s;
    int ans[N],res[25];
    unordered_map<int,int> mp;
    int main() {
        cin>>n>>m;
        for(int i=1;i<=n;++i) {
            cin>>ans[i];
            int j=i;
            while(ans[j]>ans[j>>1]&&j>=2) {
                swap(ans[j],ans[j>>1]);
                j>>=1;
            }
        }
        for(int i=1;i<=n;++i) mp.insert(make_pair(ans[i],i));
        for(int i=1;i<=m;++i) {
            cin>>a;
            cin>>s;
            if(s=="and") {
                cin>>b;
                if(mp[a]/2==mp[b]/2) res[i]=1;
                else res[i]=0;
                cin>>s;
                cin>>s;
            } else {
                cin>>s;
                cin>>s;
                if(s=="parent") {
                    cin>>s;
                    cin>>b;
                    if(mp[b]/2==mp[a]) res[i]=1;
                    else res[i]=0;
                } else if(s=="left") {
                    cin>>s;cin>>s;cin>>b;
                    if(ans[mp[b]*2]==a) res[i]=1;
                    else res[i]=0;
                } else if(s=="right") {
                    cin>>s;cin>>s;cin>>b;
                    if(ans[mp[b]*2+1]==a) res[i]=1;
                    else res[i]=0;
                } else if(s=="root") {
                    if(mp[a]==1) res[i]=1;
                    else res[i]=0;
                }
            }
        }
        for(int i=1;i<=m;++i) cout<<res[i];
        return 0;
    }
    

    第四题 7-4 Recycling of Shared Bicycles (30 分)

    • floyd
    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <vector>
    using namespace std;
    const int N = 210;
    const int INF = 0x3f3f3f3f;
    int n,m,sum,cnt;
    int G[N][N],res[N];
    bool vis[N];
    void floyd() {
        for(int k=0;k<=n;++k) {
            for(int i=0;i<=n;++i) {
                for(int j=0;j<=n;++j) {
                    if(G[i][k]!=INF&&G[k][j]!=INF&&G[i][k]+G[k][j]<G[i][j]) {
                        G[i][j]=G[j][i]=G[i][k]+G[k][j];
                    }
                }
            }
        }
    }
    int main() {
        fill(G[0],G[0]+N*N,INF);
        fill(vis,vis+N,false);
        scanf("%d %d",&n,&m);
        for(int i=0;i<=n;++i) G[i][i]=0;
        int u,v,d;
        for(int i=0;i<m;++i) {
            scanf("%d %d %d",&u,&v,&d);
            G[u][v]=G[v][u]=d;
        }
        floyd();
        u=0;
        vis[0]=true;
        res[0]=0;
        cnt=1;
        for(int i=1;i<=n;++i) {
            int mindis=INF;
            v=INF;
            for(int j=1;j<=n;++j) {
                if(j==u) continue;
                if(!vis[j]&&G[u][j]<mindis) {
                    v=j;
                    mindis=G[u][j];
                }
            }
            if(v==INF) {
                break;
            } else {
                sum+=G[u][v];
                vis[v]=true;
                res[cnt++]=v;
                u=v;
            }
        }
        for(int i=0;i<cnt;++i) {
            printf("%d",res[i]);
            if(i!=cnt-1) printf(" ");
            else printf("
    ");
        }
        if(cnt==n+1) {
            printf("%d",sum);
        } else {
            cnt=0;
            for(int i=0;i<=n;++i) {
                if(vis[i]==false) {
                    res[cnt++]=i;
                }
            }
            for(int i=0;i<cnt;++i) {
                printf("%d",res[i]);
                if(i!=cnt-1) printf(" ");
            }
        }
        return 0;
    }
    

    • dijkstra
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    const int N = 210;
    const int INF = 0x3f3f3f3f;
    int n,m,cnt,sum;
    int G[N][N];
    int dis[N],res[N];
    bool vis[N],check[N];
    void dij(int s) {
        fill(vis,vis+N,false);
        fill(dis,dis+N,INF);
        dis[s]=0;
        for(int i=0;i<=n;++i) {
            int v=-1,tempdis=INF;
            for(int j=0;j<=n;++j) {
                if(!vis[j]&&dis[j]<tempdis) {
                    v=j;
                    tempdis=dis[j];
                }
            }
            if(v==-1) break;
            vis[v]=true;
            for(int u=0;u<=n;++u) {
                if(G[v][u]!=INF&&dis[v]+G[v][u]<dis[u]) {
                    dis[u]=dis[v]+G[v][u];
                }
            }
        }
        return;
    }
    int main() {
        scanf("%d %d",&n,&m);
        fill(G[0],G[0]+N*N,INF);
        fill(check,check+N,false);
        for(int i=0;i<=n;++i) G[i][i]=0;
        int u,v,d;
        for(int i=0;i<m;++i) {
            scanf("%d %d %d",&u,&v,&d);
            G[u][v]=G[v][u]=d;
        }
        u=0;
        check[0]=true;
        res[0]=0;
        ++cnt;
        for(int i=0;i<=n;++i) {
            dij(u);
            v=-1;
            int tempdis=INF;
            for(int j=0;j<=n;++j) {
                if(j==u) continue;
                if(!check[j]&&dis[j]<tempdis) {
                    tempdis=dis[j];
                    v=j;
                }
            }
            if(v==-1) break;
            u=v;
            sum+=tempdis;
            res[cnt++]=v;
            check[v]=true;
        }
        for(int i=0;i<cnt;++i) {
            printf("%d",res[i]);
            if(i!=cnt-1) printf(" ");
            else printf("
    ");
        }
        if(cnt==n+1) {
            printf("%d",sum);
        } else {
            cnt=0;
            for(int i=0;i<=n;++i) {
                if(!check[i]) res[cnt++]=i;
            }
            for(int i=0;i<cnt;++i) {
                printf("%d",res[i]);
                if(i!=cnt-1) printf(" ");
            }
        }
        return 0;
    }
    

  • 相关阅读:
    STL 源代码分析 算法 stl_algo.h -- includes
    Objective-c 算术函数和常量代表
    文件比较,文件夹比较-- vimdiff,beyond compare, compare suite, WinMerge,Kdiff3
    PHP+lghttpd + postgresql 环境搭建
    开源免费跨平台opengl opencv webgl gtk blender, opengl贴图程序
    expect 参数处理之一
    几款屏幕录制软件 ActivePresente
    gcc -D 传值给代码,默认值为1
    error: /usr/include/stdio.h: Permission denied 的一种情况分析
    linux内核编译环境配置
  • 原文地址:https://www.cnblogs.com/lemonbiscuit/p/14546507.html
Copyright © 2020-2023  润新知