分布式队列(java)
emm,看这个题的头一眼让吓住了
给我看的一头雾水
看了一下解析,我靠,简直是天才,我丢
这道题的关键在于找出最少元素的节点
然后输出他的元素个数
在子节点同步的时候需要注意
如果他的元素个数增加后的个数
用一维数组来存储每个节点的元素个数
n个节点
一定要小于等于主节点的元素个数
因为在输入n之后要输入多行,
无法得知输入多少个结束
使用while循环来接收输入
判断条件就是看是否有下一个输入
in.hasnext()
在此之前需要用in.nextLine()来吃掉in,nextInt()接收的n后面的换行
然后先接收字符串op用来判断是哪一个操作
如果是add 操作的话后面还需要接收输入的数字
但是实际上不用管这个数字只要让主节点的元素个数+1就行了
老师在吓唬我们
同步的时候也需要接收节点的下标
节点的同步某个节点的时候某个节点的元素个数+1之后的个数一定是要小于等于主节点的元素个数
主节点的元素个数是一定要大于等于同步之后的某个节点的元素个数的
也就是Math.min(cnt[i1]+1,cnt[0])
如果查询的话就直接先便利数组
从数组中找出元素个数最小的那个,然后记录
便利完之后输出
ok,写一遍
一写就拉跨了
有问题的代码:
package Lanqiao;
import java.util.Map;
import java.util.Scanner;
/**
* @author zb
* date2025/3/27 21:48
*/
public class L19723 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int cnt[] = new int[n];
in.nextLine();
while (in.hasNext()){
String op = in.next();
if(op.equals("add")){
int num = in.nextInt();
// 主节点的元素个数++
cnt[0]++;
// System.out.println("cnt[0]++ "+cnt[0]);
}
else if (op.equals("sync")){
int pos = in.nextInt();
// 同步pos节点的元素个数
cnt[pos] = Math.min(cnt[0],cnt[pos]++);
// System.out.println(pos+" "+cnt[pos]);
}else {
// 查询
int min = Integer.MAX_VALUE;
for (int i = 0; i < n; i++) {
if(cnt[i]<min){
min =cnt[i];
}
}
System.out.println(min);
}
}
in.close();
}
}
无奖竞猜:
猜一下问题在哪里?
思路都是没有问题的
打印了一下突然想明白是这里
cnt[pos]++的话是后加,先比较
那么每次都是0 和主节点的个数在作比较
每次肯定都是0 ,这没问题把
else if (op.equals("sync")){
int pos = in.nextInt();
// 同步pos节点的元素个数
cnt[pos] = Math.min(cnt[0],cnt[pos]++);
// System.out.println(pos+" "+cnt[pos]);
}
再也不写骚操作了,写成++cnt[pos]就对了
建议写成cnt[pos]+1
import java.util.Map;
import java.util.Scanner;
/**
* @author zb
* date2025/3/27 21:48
*/
public class Main{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int cnt[] = new int[n];
in.nextLine();
while (in.hasNext()){
String op = in.next();
if(op.equals("add")){
int num = in.nextInt();
// 主节点的元素个数++
cnt[0]++;
// System.out.println("cnt[0]++ "+cnt[0]);
}
else if (op.equals("sync")){
int pos = in.nextInt();
// 同步pos节点的元素个数
cnt[pos] = Math.min(cnt[0],cnt[pos]+1);
// System.out.println(pos+" "+cnt[pos]);
}
else {
// 查询
int min = Integer.MAX_VALUE;
for (int i = 0; i < n; i++) {
if(cnt[i]<min){
min =cnt[i];
}
}
System.out.println(min);
}
}
in.close();
}
}