【vjudge训练记录】大一寒假专项训练——队列

训练情况

A题

这题A+B就当签到

B题

模板题,我们直接使用STL中的queue,q.push()为入队,q.front()为队头,q.pop()为出队,注意输出队头和出队的时候需要保证队列中有元素,pop的时候也需要输出队头。

#include <bits/stdc++.h>
// #define int long long
#define endl '\n'

using namespace std;

queue<int> q;

void solve(){
    string s; cin>>s;
    if(s == "push"){
        int x; cin>>x;
        q.push(x);
    } else if(s == "front"){
        if(q.size()){
            cout<<q.front()<<endl;
        } else {
            cout<<"error"<<endl;
        }
    } else if(s == "pop"){
        if(q.size()){
            cout<<q.front()<<endl;
            q.pop();
        } else {
            cout<<"error"<<endl;
        }
    }
}

signed main(){
    int T; cin>>T; while(T--)
    solve();
    return 0;
}

C题

更复杂的模板题,相比上一题多了一个询问队列里有几个元素,我们直接使用q.size()就可以输出,其他同理,操作之前注意判断一下队列里面为非空(要有元素)即可。

#include <bits/stdc++.h>
// #define int long long
#define endl '\n'

using namespace std;

void solve(){
    queue<int> q;
    int T; cin>>T; while(T--){
        int opt; cin>>opt;
        if(opt == 1){
            int x; cin>>x;
            q.push(x);
        } else if(opt == 2){
            if(!q.size()) cout<<"ERR_CANNOT_POP"<<endl;
            else q.pop();
        } else if(opt == 3){
            if(!q.size()) cout<<"ERR_CANNOT_QUERY"<<endl;
            else cout<<q.front()<<endl;
        } else if(opt == 4){
            cout<<q.size()<<endl;
        }
    }
}

signed main(){
    // int T; cin>>T; while(T--)
    solve();
    return 0;
}

D题

蓝桥杯 2024 省赛 Java B 原题

这题可以不用队列做,我们发现只有每次sync的时候才会改变query的答案,求当前分布式队列中有多少个元素具有可见性(即所有子节点都有这个元素),就是求副节点最短同步到哪个位置了,所以我们只要维护一个数组记录子节点目前同步到的位置,每次query的答案就是子节点位置的最小值。

#include <bits/stdc++.h>
// #define int long long
#define endl '\n'

using namespace std;

const int N = 2e3 + 3;

int n,x;
string s;
int cnt[N];

void solve(){
    cin>>n;
    while(cin>>s){
        if(s == "add"){
            cin>>x;
        } else if(s == "sync"){
            cin>>x;
            cnt[x]++;
        } else if(s == "query"){
            int mi = INT_MAX;
            for(int i = 1;i<=n-1;i++) mi = min(mi,cnt[i]);
            cout<<mi<<endl;
        }
    }
}

signed main(){
    // int T; cin>>T; while(T--)
    solve();
    return 0;
}

E题

蓝桥杯 2023 国赛 B 原题

这题使用双端队列(deque)做比较简单,有兴趣可以去了解,双端队列队头和队尾都可以入出队,所以我们只需要维护两个双端队列 a,b,如果两个队列队头的元素一样,两个全部出队,如果 a 的队头元素小于 b 的队头元素,则 a 的队头与下一个元素合并,答案加一次,再进行比较,反之亦然。

#include <bits/stdc++.h>
// #define int long long
#define endl '\n'

using namespace std;

void solve(){
    deque<int> a,b;
    int n,m; cin>>n>>m;
    for(int i = 1;i<=n;i++){
        int x; cin>>x;
        a.push_back(x);
    }
    for(int i = 1;i<=m;i++){
        int x; cin>>x;
        b.push_back(x);
    }
    int ans = 0;
    while(a.size()){
        if(a.front() == b.front()){
            a.pop_front();
            b.pop_front();
        } else if(a.front() < b.front()){
            a[1] += a[0];
            a.pop_front();
            ans++;
        } else if(a.front() > b.front()){
            b[1] += b[0];
            b.pop_front();
            ans++;
        }
    }
    cout<<ans<<endl;
}

signed main(){
    // int T; cin>>T; while(T--)
    solve();
    return 0;
}

F题

维护一个长度有限的队列表示内存,如果队列中的元素个数超出了内存的存储访问,则队头出队(最先进入内存的元素),再维护一个数组表示某个单词是否在内存中,再开一个变量表示需要额外去外存查询的次数,在每次查单词的时候且内存没有这个单词的时候答案加一,然后再把这个单词存进内存,判断内存空间是否满了,如果满了队头出队顺带更新判断单词是否在内存的数组即可。

#include <bits/stdc++.h>
// #define int long long
#define endl '\n'

using namespace std;

const int N = 1e3 + 3;

int n,m;
bool vis[N];
queue<int> q;

void solve(){
    cin>>n>>m;
    int ans = 0;
    for(int i = 1;i<=m;i++) vis[i] = 0;
    for(int i = 1;i<=m;i++){
        int x; cin>>x;
        if(!vis[x]){
            if(q.size() == n){
                vis[q.front()] = 0;
                q.pop();
            }
            q.push(x);
            vis[x] = 1;
            ans++;
        }
    }
    cout<<ans<<endl;
}

signed main(){
    // int T; cin>>T; while(T--)
    solve();
    return 0;
}
posted @   MNNUACM_2024ZY  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示