• 2021浙大计算机机试模拟赛(1)


    A. 搬家

    • stack
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <string>
    #include <stack>
    using namespace std;
    int n;
    stack<string> st;
    string op,name;
    int main() {
        cin>>n;
        for(int i=0;i<n;++i) {
            cin>>op;
            if(op=="Down") {
                cin>>name;
                st.push(name);
            } else if(op=="Up") {
                if(st.empty()) cout<<"?"<<endl;
                else {
                    cout<<st.top()<<endl;
                    st.pop();
                }
            }
        }
        return 0;
    }
    

    B. 平衡素数

    • 打表
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <string>
    #include <unordered_map>
    using namespace std;
    const int N = 10001000;
    bool isprime[N];
    int ans[N],cnt,n,num,bns[N],pos;
    unordered_map<int,int> mp;
    void prime() {
        fill(isprime,isprime+N,true);
        isprime[0]=isprime[1]=false;
        for(int i=2;i<N;++i) {
            if(isprime[i]) {
                for(int j=i*2;j<N;j+=i) {
                    isprime[j]=false;
                }
                ans[cnt]=i;
                mp.insert(make_pair(i,cnt));
                ++cnt;
            }
        }
        for(int i=1;i<cnt-1;++i) {
            if((ans[i-1]+ans[i+1])==ans[i]*2) {
                bns[pos++]=ans[i];
            }
        }
        return;
    }
    int main() {
        prime();
        scanf("%d",&n);
        for(int i=0;i<n;++i) {
            bool flag=true;
            scanf("%d",&num);
            if(isprime[num]==false) {
                flag=false;
            } else {
                int b=mp[num];
                if(b==0||b==cnt-1) {
                    flag=false;
                } else {
                    int a=(ans[b-1]+ans[b+1]);
                    if(a!=num*2) flag=false;
                }
            }
            if(flag) printf("Yes
    ");
            else {
                int l=0,r=pos-1;
                while(l<r) {
                    int mid=l+r>>1;
                    if(bns[mid]>=num) r=mid;
                    else l=mid+1;
                }
                printf("No %d
    ",bns[l]);
            }
        }
        return 0;
    }
    

    C. 二叉树的最小带权路径长度

    • queue
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <string>
    #include <vector>
    #include <queue>
    using namespace std;
    const int N = 110;
    struct node {
        int id,val,lc,rc,level;
    };
    vector<node> res;
    queue<node> Q;
    bool cmp(node &a, node &b) {
        return a.val>b.val;
    }
    int n,cnt,sum;
    node ans[2*N];
    int main() {
        scanf("%d",&n);
        int num;
        for(int i=0;i<n;++i) {
            scanf("%d",&num);
            res.push_back(node{i,num,-1,-1,0});
            ans[i]=node{i,num,-1,-1,0};
        }
        cnt=n;
        while(res.size()!=1) {
            sort(res.begin(),res.end(),cmp);
            node p=res[res.size()-1];
            res.pop_back();
            node q=res[res.size()-1];
            res.pop_back();
            int num=p.val+q.val;
            res.push_back(node{cnt,num,p.id,q.id,0});
            ans[cnt]=node{cnt,num,p.id,q.id,0};
            ++cnt;
        }
        node root=res[0];
        Q.push(root);
        while(!Q.empty()) {
            root=Q.front();
            Q.pop();
            if(root.lc!=-1) {
                ans[root.lc].level=root.level+1;
                Q.push(ans[root.lc]);
            }
            if(root.rc!=-1) {
                ans[root.rc].level=root.level+1;
                Q.push(ans[root.rc]);
            }
            if(root.lc==-1&&root.rc==-1) sum+=root.level*root.val;
        }
        printf("%d",sum);
        return 0;
    }
    

    D. 紫金之火,在于丹阳

    • dijkstra
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <string>
    using namespace std;
    const int N = 510;
    const int INF = 0x3f3f3f3f;
    int n,m,p,k;
    int s,t,d,b;
    int dist[N],vis[N],G[N][N],res[N];
    int cnt;
    void dij() {
        fill(dist,dist+N,INF);
        dist[p]=0;
        fill(vis,vis+N,false);
        for(int i=0;i<n;++i) {
            int v=-1,mindis=INF;
            for(int j=0;j<n;++j) {
                if(!vis[j]&&dist[j]<mindis) {
                    v=j;
                    mindis=dist[j];
                }
            }
            if(v==-1) break;
            vis[v]=true;
            for(int u=0;u<n;++u) {
                if(v!=u&&!vis[u]&&G[v][u]!=INF&&dist[v]+G[v][u]<dist[u]) {
                    dist[u]=dist[v]+G[v][u];
                }
            }
        }
    }
    int main() {
        scanf("%d %d %d",&n,&m,&p);
        fill(G[0],G[0]+N*N,INF);
        for(int i=0;i<n;++i) G[i][i]=0;
        for(int i=0;i<m;++i) {
            scanf("%d %d %d %d",&s,&t,&d,&b);
            G[t][s]=d;
            if(b==1) G[s][t]=d;
        }
        dij();
        scanf("%d",&k);
        for(int i=0;i<k;++i) {
            scanf("%d",&s);
            res[cnt++]=dist[s];
        }
        for(int i=0;i<cnt;++i) {
            if(res[i]!=INF) printf("%d",res[i]);
            else printf("-1");
            if(i!=cnt-1) printf(" ");
        }
        return 0;
    }
    
  • 相关阅读:
    -webkit-margin-before 及 扩展浏览器前缀、内核
    vue封装分页组件
    vue项目中使用qrcode生成二维码
    git中全局设置用户名、邮箱
    promise.all 解说
    超详细弹性盒子布局
    js对象转数组
    js取整数、取余数的方法
    数组方法大全
    Vue绑定class
  • 原文地址:https://www.cnblogs.com/lemonbiscuit/p/14549982.html
Copyright © 2020-2023  润新知