题解P11043 [蓝桥杯 2024 省 Java B] 分布式队列
4041nofoundGeoge · · 题解
题目大意
我看了半小时,发现这道题虽然看起来非常长,实则就可以归纳成几个重点。挑重点讲就是输入格式里的三段话:
接下来包含多行输入,每一行包含一个操作,操作类型共有以下三个:add、sync和query,各自的输入格式如下:
add element:表示这是一个添加操作,将元素element 添加到队列中;sync follower_id:表示这是一个同步操作,follower\_id 号副节点会从主节点中同步下一个自己缺失的元素;query:查询操作,询问当前分布式队列中有多少个元素具有可见性。
这三段用人话讲就是说:
add element:表示的是在头结点加入元素。sync follower_id:表示同步主节点,其实就是把follower_id的结点加一。query:表示找出结点中最小的副结点代表的个数。
在看一眼题目样例:非常好理解。
写代码前的讲究(c++)
- 尽量不用万能头文件
bits/stdc++.h因为会耗费很多资源。 - 尽量用
printf和scanf因为这比cout和cin更快。 - 用
while输入上面的几个操作符,因为你也不知道有多少行。
最后祝大家 AC 快乐
//java代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] cnt = new int[2000005];
while (scanner.hasNext()) {
String s = scanner.next();
int waste = 0;
if (s.equals("add")) {
waste = scanner.nextInt(); // 读取但忽略
cnt[0]++;
} else if (s.equals("sync")) {
waste = scanner.nextInt();
cnt[waste]++;
} else if (s.equals("query")) {
int ans = 2000005;
for (int i = 0; i < n; i++) {
ans = Math.min(ans, cnt[i]);
}
System.out.println(ans);
}
}
scanner.close(); //好习惯
}
}
//c++代码
//这道题给的数据很水,所以不开longlong也没事
#include<iostream>
using namespace std;
int cnt[2000005];
int main(){
int n;
scanf("%d",&n);
string s;
int waste;//当输入add时用的减少资源浪费
while(cin>>s){
if(s=="add"){
scanf("%d",&waste);
//因为是结点加东西,所以加了什么无所谓
cnt[0]++;
}
else if(s=="sync"){
scanf("%d",&waste);
cnt[waste]++;//这个废物真正的用处
}
else if(s=="query"){
//临时抱佛脚找到最短的长度就可以了
int ans=10000005;
for(int i=0;i<n;i++)ans=min(ans,cnt[i]);
printf("%d\n",ans);
}
}
return 0;
}