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\n");
        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\n",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;
}
posted @ 2021-03-17 17:06  lemonsbiscuit  阅读(150)  评论(0编辑  收藏  举报