【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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具