题目描述
小蓝最近学习了一种神奇的队列:分布式队列。简单来说,分布式队列包含 𝑁N 个节点(编号为 0 至 𝑁−1,其中 0 号为主节点),其中只有一个主节点,其余为副节点。主、副节点中都各自维护着一个队列,当往分布式队列中添加元素时都是由主节点完成的(每次都会添加元素到队列尾部);副节点只负责同步主节点中的队列。可以认为主/副节点中的队列是一个长度无限的一维数组,下标为 0,1,2,3,…,同时副节点中的元素的同步顺序和主节点中的元素添加顺序保持一致。
由于副本的同步速度各异,因此为了保障数据的一致性,元素添加到主节点后,需要同步到所有的副节点后,才具有可见性。
给出一个分布式队列的运行状态,所有的操作都按输入顺序执行。你需要回答在某个时刻,队列中有多少个元素具有可见性。
输入格式
第一行包含一个整数 𝑁,表示节点个数。
接下来包含多行输入,每一行包含一个操作,操作类型共有以下三个:add、sync 和 query,各自的输入格式如下:
-
add element
:表示这是一个添加操作,将元素 𝑒𝑙𝑒𝑚𝑒𝑛𝑡element 添加到队列中; -
sync follower_id
:表示这是一个同步操作,𝑓𝑜𝑙𝑙𝑜𝑤𝑒𝑟_𝑖𝑑follower_id 号副节点会从主节点中同步下一个自己缺失的元素; -
query
:查询操作,询问当前分布式队列中有多少个元素具有可见性。
输出格式
对于每一个 query 操作,输出一行,包含一个整数表示答案。
输入输出样例
输入 #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
#include<bits/stdc++.h>
using namespace std;
const int N=20;
int queuex[N];
int n;
int query(){
int result=queuex[0];
for(int i=1;i<n;i++){
if(queuex[i]<result)
result=queuex[i];
}
return result;
}
int main(){
int m;
char s[1000];
cin>>n;
while(cin>>s)
if(strcmp(s,"add")==0){
cin>>m;
queuex[0]++;
}
else if(strcmp(s,"sync")==0){
cin>>m;
if(queuex[m]<=queuex[0])
queuex[m]++;
}
else {
cout<<query()<<endl;
}
return 0;
}
这题用的是模拟