蓝桥杯历届真题 #分布式队列 (Java,C++)

server/2025/1/15 7:53:58/

文章目录

  • 题目解读
  • [蓝桥杯 2024 省 Java B] 分布式队列
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 提示
  • 思路
  • 完整代码


题目解读

题目链接

[蓝桥杯 2024 省 Java B] 分布式队列

题目描述

小蓝最近学习了一种神奇的队列:分布式队列。简单来说,分布式队列包含 N N N 个节点(编号为 0 0 0 N − 1 N−1 N1,其中 0 0 0 号为主节点),其中只有一个主节点,其余为副节点。主、副节点中都各自维护着一个队列,当往分布式队列中添加元素时都是由主节点完成的(每次都会添加元素到队列尾部);副节点只负责同步主节点中的队列。可以认为主/副节点中的队列是一个长度无限的一维数组,下标为 0 , 1 , 2 , 3 , … 0,1,2,3,\dots 0,1,2,3,,同时副节点中的元素的同步顺序和主节点中的元素添加顺序保持一致。

由于副本的同步速度各异,因此为了保障数据的一致性,元素添加到主节点后,需要同步到所有的副节点后,才具有可见性。

给出一个分布式队列的运行状态,所有的操作都按输入顺序执行。你需要回答在某个时刻,队列中有多少个元素具有可见性。

输入格式

第一行包含一个整数 N N N,表示节点个数。

接下来包含多行输入,每一行包含一个操作,操作类型共有以下三个:add、sync 和 query,各自的输入格式如下:

  1. add element:表示这是一个添加操作,将元素 e l e m e n t element element 添加到队列中;

  2. sync follower_id:表示这是一个同步操作, f o l l o w e r _ i d follower\_id follower_id 号副节点会从主节点中同步下一个自己缺失的元素;

  3. query:查询操作,询问当前分布式队列中有多少个元素具有可见性。

输出格式

对于每一个 query 操作,输出一行,包含一个整数表示答案。

样例 #1

样例输入 #1

3
add 1
add 2
query
add 1
sync 1
sync 1
sync 2
query
sync 1
query
sync 2
sync 2
sync 1
query

样例输出 #1

0
1
1
3

提示

【样例说明】

执行到第一个 query 时,队列内容如下:

  • 节点 0 0 0 [ 1 , 2 ] [1,2] [1,2]
  • 节点 1 1 1 [ ] [] []
  • 节点 2 2 2 [ ] [] []

两个副节点中都无元素,因此答案为 0 0 0

执行到第二个 query 时,队列内容如下:

  • 节点 0 0 0 [ 1 , 2 , 1 ] [1,2,1] [1,2,1]
  • 节点 1 1 1 [ 1 , 2 ] [1,2] [1,2]
  • 节点 2 2 2 [ 1 ] [1] [1]

只有下标为 0 0 0 的元素被所有节点同步,因此答案为 1 1 1

执行到第三个 query 时,队列内容如下:

  • 节点 0 0 0 [ 1 , 2 , 1 ] [1,2,1] [1,2,1]
  • 节点 1 1 1 [ 1 , 2 , 1 ] [1,2,1] [1,2,1]
  • 节点 2 2 2 [ 1 ] [1] [1]

只有下标为 0 0 0 的元素被所有节点同步,因此答案为 1 1 1

执行到第四个 query 时,队列内容如下:

  • 节点 0 0 0 [ 1 , 2 , 1 ] [1,2,1] [1,2,1]
  • 节点 1 1 1 [ 1 , 2 , 1 ] [1,2,1] [1,2,1]
  • 节点 2 2 2 [ 1 , 2 , 1 ] [1,2,1] [1,2,1]

三个元素都被所有节点同步,因此答案为 3 3 3

【评测用例规模与约定】

设输入的操作数为 q q q

对于 30 % 30\% 30% 的评测用例: 1 ≤ q ≤ 100 1\leq q \leq 100 1q100

对于 100 % 100\% 100% 的评测用例: 1 ≤ q ≤ 2000 1\leq q\leq 2000 1q2000 1 ≤ N ≤ 10 1\leq N\leq 10 1N10 1 ≤ f o l l o w e r _ i d < N 1\leq follower\_id<N 1follower_id<N 0 ≤ e l e m e n t ≤ 1 0 5 0\leq element\leq10^5 0element105

数据保证执行同步操作时, f o l l o w e r _ i d follower\_id follower_id 号副节点一定缺失元素

思路

由于最多有10个结点,可以采用暴力的方法
使用数组进行模拟
数组的下标代表第几个队列
数组的大小代表当前队列有几个元素
由于同步元素是同步主队列的下一个元素,因此我们不需要关心具体的元素值,只需要关心有几个元素即可
如果是add操作,我们只需要让其指定的队列元素+1即可,注意:要注意同步的个数不能超过主队列元素个数
查询的时候遍历每个队列,其最小的值就是可见的元素数量

完整代码

#include<bits/stdc++.h>using namespace std;const int N = 15;int cnt[N];int n;int check(){int res=2000;for(int i=1; i<n; i++){res=min(cnt[i],res);}return res;
}int main(){cin>>n;string op;int num;while(cin>>op){//主队列用0号结点if(op=="add"){cin>>num;cnt[0]++;}else if(op=="sync"){cin>>num;if(cnt[num]<cnt[0])cnt[num]++;}else{cout<<check()<<endl;}}return 0;
}
java">import java.util.Scanner;class Main{static int N =15;static int cnt[] = new int[N];static Scanner sc = new Scanner(System.in);static int n =sc.nextInt();public static void main(String[] args) {String op;int num;while(sc.hasNext()){op=sc.next();if(op.equals("add")){num=sc.nextInt();cnt[0]++;}else if(op.equals("sync")){num=sc.nextInt();if(cnt[num]<cnt[0])cnt[num]++;}else{System.out.println(check());}}}static int check(){int res=2000;for(int i=1; i<n; i++){res=Math.min(cnt[i],res);}return res;}
}

🌻编写本篇文章目的是笔者想以输出的形式进行学习,顺便记录学习点滴🌻

🌹 如果本篇文章对你有帮助的话那就点个赞吧👍🌹

😇 本篇文章可能存在多处不足,如有修改意见,可以私信或者评论我哦 😇


在这里插入图片描述


http://www.ppmy.cn/server/158490.html

相关文章

android wifi framework与wpa_supplicant的交互

android frmework直接与wpa_supplicant进行交互&#xff0c;使用aidl或者hidl 二、事件 framework注册事件的地方&#xff1a; packages/modules/Wifi/service/java/com/android/server/wifi/SupplicantStaIfaceCallbackImpl.java class SupplicantStaIfaceCallbackImpl exte…

redis缓存篇知识点总结

1.缓存雪崩 当大量缓存数据在同一时间过期(失效)或者 Redis 故障宕机时,如果此时有大量的用户请求,都无法在 Redis 中处理,于是全部请求都直接访问数据库,从而导致数据库的压力骤增,严重的会造成数据库宕机,从而形成一系列连锁反应,造成整个系统崩溃 发生缓存雪崩有两…

STM32-PWR电源控制

1.0 定义 PWR&#xff08;Power Control&#xff09;电源控制 PWR负责管理STM32内部的电源供电部分&#xff0c;可以实现可编程电压监测器和低功耗模式的功能 可编程电压监测器&#xff08;PVD&#xff09;可以监控VDD电源电压&#xff0c;当VDD下降到PVD阀值以下或上升到PVD阀…

【面试题】技术场景 4、负责项目时遇到的棘手问题及解决方法

工作经验一年以上程序员必问问题 面试题概述 问题为在负责项目时遇到的棘手问题及解决方法&#xff0c;主要考察开发经验与技术水平&#xff0c;回答不佳会影响面试印象。提供四个回答方向&#xff0c;准备其中一个方向即可。 1、设计模式应用方向 以登录为例&#xff0c;未…

数据结构------树

前言&#xff1a;前面我们学习了栈和队列。今天我们来学习一种新的数据结构---------树。 首先我们来了解一下树的概念。 1.树的概念与结构 前面我们学习过的顺序表&#xff0c;栈都是一种顺序结构。链表&#xff0c;队列是链式结构。今天学习的树也是一种链式结构。它是由n…

面向对象分析与设计Python版 面向对象设计方法

文章目录 前言一、职责驱动设计二、职责驱动设计-案例 前言 面向对象设计目标&#xff1a;在面向对象分析建立的领域模型的基础上&#xff0c;定义对象操作&#xff08;职责&#xff09;。为对象分配职责的方法有&#xff1a; 职责驱动设计遵循GRASP设计原则&#xff08;Gene…

面试题:Java中并发并行串行的区别

在 Java 中&#xff0c;并发、并行和串行是三个常见的概念&#xff0c;它们描述了程序中任务执行的不同方式。虽然它们之间存在某些相似之处&#xff0c;但它们的实现和用途有显著的区别。 1. 串行 (Serial) 串行是指任务按照顺序一个接一个地执行&#xff0c;前一个任务完成…

微服务之松耦合

参考&#xff1a;https://microservices.io/post/architecture/2023/03/28/microservice-architecture-essentials-loose-coupling.html There’s actually two different types of coupling: runtime coupling - influences availability design-time coupling - influences…