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

· · 题解

题目大意

我看了半小时,发现这道题虽然看起来非常长,实则就可以归纳成几个重点。挑重点讲就是输入格式里的三段话:

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

  1. add element:表示这是一个添加操作,将元素 element 添加到队列中;
  2. sync follower_id:表示这是一个同步操作,follower\_id 号副节点会从主节点中同步下一个自己缺失的元素;
  3. query:查询操作,询问当前分布式队列中有多少个元素具有可见性。

这三段用人话讲就是说:

  1. add element:表示的是在头结点加入元素。
  2. sync follower_id:表示同步主节点,其实就是把 follower_id 的结点加一。
  3. query:表示找出结点中最小的副结点代表的个数。

在看一眼题目样例:非常好理解。

写代码前的讲究(c++)

  1. 尽量不用万能头文件 bits/stdc++.h 因为会耗费很多资源。
  2. 尽量用 printfscanf 因为这比 coutcin 更快。
  3. 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;
}