当前位置: 首页 > news >正文

简单负载均衡

题目描述

某工程师为了解决服务器负载过高的问题,决定使用多个服务器来分担请求消息。
现给定 k 台服务器(编号从 1 到 k),以及一批请求消息的信息,格式为到达时刻 负载大小,消息说明:
每个时刻最多只有一条消息到达;
负载大小表示服务器处理该消息所需时长。
请计算在负载分担规则下,哪些服务器处理的负载最高(服务器处理的负载为所处理的所有消息的负载累加和),并以升序返回这些服务器的编号。
负载分担规则:
按顺序循环分配服务器,如:有3台服务器且都空闲,分配的方式为 1->2->3->1… ;
如果某台服务器繁忙,则跳过该服务器;
如果一条消息到达时所有服务器繁忙,则丢弃这条消息。

解答要求

时间限制:1000ms, 内存限制:512MB
输入
第一行为服务器的个数 k,k 的范围 [1, 50000]
第二行为请求消息个数 n,n 的范围 [1, 50000]
随后的 n 行为各条消息的到达时刻和负载大小(注意并非按到达时刻升序给出)。
消息到达时刻的范围 [1, 10^9],负载大小的范围 [1, 10^9]

输出

处理负载最多的服务器编号,注意按升序输出。

样例

输入样例 1

3
7
1 15
2 10
12 10
5 10
6 10
30 15
32 10

输出样例 1

1 3

提示样例 1

根据输入信息,经过分析可得以下表:

到达时刻消息负载完成时刻(不包含)分配服务器号
115161
210122
510153
61016丢弃
1210222
3015453
3210421

根据上表分析,1和3号服务器处理的负载都为25,按照升序排列,输出的结果为:1 3

Java算法源码

import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;public class Main {// 待实现函数,在此函数中填入答题代码static int[] findHighestLoadServers(int serverNum, Message[] messages) {boolean[] isBusy = new boolean[serverNum]; // 下标为server编号-1,值为是否忙碌int[] serverLoad = new int[serverNum]; // 下标为server编号-1,值为总LoadMessage[] processingMsg = new Message[serverNum]; // 下标为server编号-1,值为目前仍在处理的 message信息// 首先将消息按时间排序Arrays.sort(messages, Comparator.comparingInt(o -> o.time));int lastProcessIdx = -1; // 上次分配执行的服务器,从-1开始// 依次处理 messagesfor (Message message : messages) {// 首先更新时间updateTime(message.time, isBusy, processingMsg, serverNum);// 从 lastProcessIdx 下一个位置开始,循环找到第一个空闲的server// 按顺序循环分配服务器:i最大值可为 2 * serverNum,使用 i % serverNum 得到对应循环的下标for (int i = lastProcessIdx + 1; i < 2 * serverNum; i++) {// 不忙,说明找到空闲的Serverif (!isBusy[i % serverNum]) {processingMsg[i % serverNum] = message; // message添加到processingMsgserverLoad[i % serverNum] += message.load; // 计算该server的总负载值isBusy[i % serverNum] = true; // 标记该server为忙碌lastProcessIdx = i % serverNum; // 记录下 lastProcessIdx 以下次循环使用break;}}}// 统计结果List<int[]> idLoadArrList = new ArrayList<>(); // [serverId, serverLoad]for (int i = 0; i < serverNum; i++) {idLoadArrList.add(new int[] {i + 1, serverLoad[i]});}idLoadArrList.sort((o1, o2) -> o1[1] != o2[1] ? o2[1] - o1[1] : o1[0] - o2[0]); // 按serverLoad降序,serverId升序// 生成答案List<Integer> ansList = new ArrayList<>();ansList.add(idLoadArrList.get(0)[0]);int maxLoad = idLoadArrList.get(0)[1];int i = 1;// 将与最大值相等的serverId加入结果集while (i < idLoadArrList.size() && idLoadArrList.get(i)[1] == maxLoad) {ansList.add(idLoadArrList.get(i)[0]);i++;}return ansList.stream().mapToInt(Integer::valueOf).toArray();}private static void updateTime(int time, boolean[] isBusy, Message[] processingMsg, int serverNum) {for (int i = 0; i < serverNum; i++) {// 空闲的不处理if (!isBusy[i]) {continue;}// 忙碌的检查是否处理完了Message message = processingMsg[i];if (message.time + message.load <= time) {isBusy[i] = false;processingMsg[i] = null;}}}static class Message {int time;int load;};public static void main(String[] args) {Scanner cin = new Scanner(System.in, StandardCharsets.UTF_8.name());int serverNum = cin.nextInt();int messageNum = cin.nextInt();Message[] messages = new Message[messageNum];for (int i = 0; i < messages.length; i++) {Message message = new Message();message.time = cin.nextInt();message.load = cin.nextInt();messages[i] = message;}cin.close();int[] highestLoadServers = findHighestLoadServers(serverNum, messages);String[] strResult = Arrays.stream(highestLoadServers).mapToObj(String::valueOf).toArray(String[]::new);System.out.println(String.join(" ", strResult));}
}

相关文章:

简单负载均衡

题目描述 某工程师为了解决服务器负载过高的问题&#xff0c;决定使用多个服务器来分担请求消息。 现给定 k 台服务器&#xff08;编号从 1 到 k&#xff09;&#xff0c;以及一批请求消息的信息&#xff0c;格式为到达时刻 负载大小&#xff0c;消息说明&#xff1a; 每个时刻…...

Portforge:一款功能强大的轻量级端口混淆工具

关于Portforge Portforge是一款功能强大的轻量级端口混淆工具&#xff0c;该工具使用Crystal语言开发&#xff0c;可以帮助广大研究人员防止网络映射&#xff0c;这样一来&#xff0c;他人就无法查看到你设备正在运行&#xff08;或没有运行&#xff09;的服务和程序了。简而言…...

1.8. 离散时间鞅-无界停时定理与随机游走

无界停时定理与随机游走 无界停时定理与随机游走1. 无界停时定理1.1. 一致可积1.2. 非一致可积2. 应用于随机游动-鞅方法2.1. 随机游走构造的鞅2.2. 对称简单随机游走无界停时定理与随机游走 1. 无界停时定理 本节给出一致可积下鞅的无界停时定理,说明一致可积下鞅的停止过程…...

Google Pixel4手机刷机+Root+逆向环境详细教程

Google Pixel4手机刷机Root逆向环境配置详细教程 刷机工具下载 Windows10、Google Pixel4手机当前安卓10系统、adb工具、要刷的谷歌原生的Android11最新刷机包、安装google usb驱动、美版临时twrp-3.6.0_11-0-flame.img和美版永久twrp-installer-3.6.0_11-0-flame.zip、Magis…...

IT项目管理-小题计算【太原理工大学】

1.合同总价问题 问承包商的利润是&#xff1f; 实际利润目标利润&#xff08;目标成本-实际成本&#xff09;*卖方分担比例 解&#xff1a;10 000&#xff08;100 000 - 90 000&#xff09;* 0.2 12 000&#xff08;元&#xff09; 实际成本有时也写作最终成本&#xff0c;问承…...

ARP欺骗使局域网内设备断网

一、实验准备 kali系统&#xff1a;可使用虚拟机软件模拟 kali虚拟机镜像链接&#xff1a;https://www.kali.org/get-kali/#kali-virtual-machines 注意虚拟机网络适配器采用桥接模式 局域网内存在指定断网的设备 二、实验步骤 打开kali系统命令行&#xff1a;ctrlaltt可快…...

Android动画(四):PathMeasure实现路径动画

文章概览 1 PathMeasure概述2 实现路径加载动画3 实现箭头加载动画4 实现操作成功动画 本系列将介绍以下内容&#xff1a; Android动画 1 PathMeasure概述 PathMeasure是一个单独的类&#xff0c;其全部源码如下&#xff08;请详细研读注释&#xff09;&#xff1a; package…...

HTTP 连接详解

概述 世界上几乎所有的 HTTP 通信都是由 TCP/IP 承载的&#xff0c;客户端可以打开一条TCP/IP连接&#xff0c;连接到任何地方的服务器。一旦连接建立&#xff0c;客户端和服务器之间交换的报文就永远不会丢失、受损或失序 TCP&#xff08;Transmission Control Protocol&…...

练习题(2024/5/12)

1二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例 1: 输入: nums [-1,0,3,5,9,12], target 9 输出: 4…...

Day50代码随想录动态规划part12:309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

Day50 动态规划part12 股票问题 309.最佳买卖股票时机含冷冻期 leetcode题目链接&#xff1a;309. 买卖股票的最佳时机含冷冻期 - 力扣&#xff08;LeetCode&#xff09; 题意&#xff1a;给定一个整数数组&#xff0c;其中第 i 个元素代表了第 i 天的股票价格 。设计一个算…...

【软考】scrum的步骤

目录 1. 明确产品愿景和需求2. 制定计划和任务列表3. 进行迭代开发&#xff08;Sprint&#xff09;4. Sprint评审会议5. Sprint回顾会议6. 重复迭代 1. 明确产品愿景和需求 1.这个过程通常由项目所有者和利益相关者参与&#xff0c;目的是确保整个团队对项目的目标和方向有清晰…...

【C语言】编译与链接

✨✨欢迎大家来到Celia的博客✨✨ &#x1f389;&#x1f389;创作不易&#xff0c;请点赞关注&#xff0c;多多支持哦&#x1f389;&#x1f389; 所属专栏&#xff1a;C语言 个人主页&#xff1a;Celias blog~ 目录 引言 一、翻译环境 1.1 编译 1.1.1 预处理 1.1.2 编译 …...

Consul 注册的服务地址变成了 127.0.1.1

问题 我们的服务一直用 Consul 作为注册中心&#xff0c;在 AWS 和 阿里云上使用的时候&#xff0c;没出现过问题。最近把一些服务迁到腾讯云的时候&#xff0c;遇到一个问题&#xff1a;注册的服务地址都是 127.0.1.1。 127.0.1.1 这个地址我们平时遇到的比较少&#xff0c;…...

数字水印 | 离散小波变换 DWT 的 Python 代码实现

&#x1f34d;原文&#xff1a; 【图像处理】图像离散小波变换及 Python 代码实现 &#x1f34d;写在前面&#xff1a; 本文在原文的基础上补全了代码。 1 环境准备 ① 安装 p y w t \mathsf{pywt} pywt 包&#xff1a; pip install PyWavelets说明&#xff1a; p y w t \…...

[框架] Unity 公共执行器

本篇我们通过使用单例模式来创建一个公共执行器&#xff0c;使得原本应该在Update()、FixedUpdate()中的指令都可以统一放在一个对象中执行&#xff0c;且可进行添加和移除操作。 1. 创建单例模式改造器&#xff1a;SingletonMono 我们先创建一个单例模式改造器&#xff0c;使…...

二进制转为HEX数组小工具

在使用RA8889时&#xff0c;JPG的解码只能从FLASH的DMA通道获取&#xff0c;那么如果要从远端、或者SD卡等处读取JPG图片出来显示怎么办&#xff1f; RA8889支持JPG图片硬解码&#xff0c;但数据流是从FLASH进行DMA读取的&#xff0c;然后再进行解码。因此这种情况下&#xff…...

数据结构-二叉树-红黑树

一、红黑树的概念 红黑树是一种二叉搜索树&#xff0c;但在每个节点上增加一个存储位表示节点的颜色&#xff0c;可以是Red或者BLACK&#xff0c;通过对任何一条从根到叶子的路径上各个节点着色方式的限制&#xff0c;红黑树确保没有一条路径会比其他路径长出两倍&#xff0c;…...

C++11 新特性 decltype 说明符

一、typeof与typeid 1.1、typeof 在C11标准之前&#xff0c;GCC已经提供了一个类似功能的运算符 typeof对类型进行推导&#xff0c;但是这毕竟是编译器的实现&#xff0c;不是标准。 int a 0; typeof(a) b 5;1.2、typeid C标准提供了 typeid 运算符&#xff0c;获取的类型…...

java线程局部变量使用方式

线程局部变量是Java中用于存储线程本地信息的变量。这种变量仅在线程的生命周期内存在&#xff0c;并且每个线程都有自己的一份拷贝。换句话说&#xff0c;线程局部变量是线程私有的&#xff0c;其他线程无法访问。 使用场景主要包括&#xff1a; 1. 存储线程状态信息&#xff…...

【隧道篇 / WAN优化】(7.4) ❀ 01. 启动WAN优化 ❀ FortiGate 防火墙

【简介】几乎所有的人都知道&#xff0c;防火墙自带的硬盘是用来保存日志&#xff0c;以方便在出现问题时能找到原因。但是很少的人知道&#xff0c;防火墙自带的硬盘其实还有另一个功能&#xff0c;那就是用于WAN优化。 防火墙自带的硬盘 在FortiGate防火墙A、B、C、D系列&…...

Simulink双矢量MPC实战:从郭磊磊论文到可运行的Matlab Function代码(调制模型预测控制详解)

Simulink双矢量MPC实战&#xff1a;从理论到代码的完整实现路径 当我在实验室第一次尝试复现郭磊磊老师那篇经典论文时&#xff0c;面对12种矢量组合和复杂的PWM生成逻辑&#xff0c;完全不知从何下手。经过三个月的反复试验和代码调试&#xff0c;终于摸清了从论文公式到可运行…...

3D元器件库在PCB设计中的关键作用与应用

1. 为什么你需要一套完整的3D元器件库作为一名电子工程师&#xff0c;我深知在PCB设计过程中&#xff0c;3D元器件库的重要性。传统的2D设计虽然能满足基本需求&#xff0c;但在实际生产装配时往往会遇到各种意想不到的机械干涉问题。记得我刚开始做硬件设计时&#xff0c;就曾…...

第二桌面 + 小龙虾:让企业AI智能体安全落地、全员可用

本文发布于2026年4月1日。引言&#xff1a;从“养虾”到“用虾”&#xff0c;AI落地需要新底座过去几个月&#xff0c;OpenClaw&#xff08;昵称“小龙虾”&#xff09;在开发者圈子里火得一塌糊涂。这个开源AI智能体网关&#xff0c;能听懂人话&#xff0c;还能替你操作电脑、…...

Vue 组态化管道流动效果:从零构建现代化流体模拟系统

1. 为什么需要管道流动模拟系统 在工业自动化和教学演示领域&#xff0c;可视化管道系统是一个常见需求。想象一下化工厂的液体输送管道、城市供水系统或者实验室的流体实验装置&#xff0c;这些场景都需要直观展示流体在管道中的流动状态。传统做法是使用静态图片或简单动画&a…...

【Java外部函数性能优化黄金法则】:20年JVM专家亲授JNI/FFM调优的7大致命误区与3步极速修复方案

第一章&#xff1a;Java外部函数优化的演进脉络与性能本质Java平台对外部函数调用&#xff08;Foreign Function & Memory API&#xff0c;即JEP 454/464/471/472&#xff09;的演进&#xff0c;标志着JVM从“纯Java世界”迈向系统级互操作的新纪元。其性能本质并非单纯降低…...

DeepSeek句式重构指令怎么用?手把手教你降AI率超过30%

第一次操作的话&#xff0c;照着下面的步骤来&#xff0c;15分钟内搞定DeepSeek句式重构指令、降AI、降AIGC率。 工具选嘎嘎降AI&#xff08;www.aigcleaner.com&#xff09;&#xff0c;达标率99.26%&#xff0c;有退款保障&#xff0c;操作也不复杂。 准备工作 需要准备的&…...

Pixel Epic智识终端效果展示:跨领域研报生成一致性与专业性验证

Pixel Epic智识终端效果展示&#xff1a;跨领域研报生成一致性与专业性验证 1. 产品概览与核心价值 Pixel Epic智识终端是一款基于AgentCPM-Report大模型构建的专业研究报告生成工具。与传统AI工具不同&#xff0c;它创新性地采用了像素RPG游戏的美学设计&#xff0c;将枯燥的…...

源代码之下的硅基启示录——Claude Code“核泄漏”事件的深度剖析与时代回响

引言 公元2026年3月30日&#xff0c;一个看似平常的春日&#xff0c;硅基世界却迎来了一场史无前例的地震。 一家以“安全”为最高信条的AI公司&#xff0c;以一种最荒诞的方式&#xff0c;亲手打开了潘多拉的魔盒。Anthropic&#xff0c;这家估值高达3800亿美元的AI新贵&#…...

Doris集群部署避坑指南:3FE+3BE配置全流程(含Java环境配置与常见问题解决)

Doris集群部署实战&#xff1a;3FE3BE高可用架构搭建与深度调优 在企业级数据分析场景中&#xff0c;Doris凭借其出色的实时分析性能和高并发处理能力&#xff0c;已成为众多企业的首选OLAP引擎。本文将基于3FE&#xff08;Frontend&#xff09;3BE&#xff08;Backend&#xf…...

koanf自定义Provider开发:扩展你的配置源终极指南

koanf自定义Provider开发&#xff1a;扩展你的配置源终极指南 【免费下载链接】koanf Simple, extremely lightweight, extensible, configuration management library for Go. Supports JSON, TOML, YAML, env, command line, file, S3 etc. Alternative to viper. 项目地址…...