1 条题解

  • 0
    @ 2025-8-24 23:03:44

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 4041nofoundGeoge
    随缘壶关|同是天涯OIers,相逢何必曾相识! || 2025

    搬运于2025-08-24 23:03:44,当前版本为作者最后更新于2024-09-13 19:44:44,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题目大意

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

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

    1. add element:表示这是一个添加操作,将元素 elementelement 添加到队列中;
    2. sync follower_id:表示这是一个同步操作,follower_idfollower\_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;
    }
    
    • 1

    信息

    ID
    10684
    时间
    3000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者