news 2026/2/27 22:42:33

(新卷,100分)- 食堂供餐(Java JS Python C)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
(新卷,100分)- 食堂供餐(Java JS Python C)

(新卷,100分)- 食堂供餐(Java & JS & Python & C)

题目描述

某公司员工食堂以盒饭方式供餐。

为将员工取餐排队时间降低为0,食堂的供餐速度必须要足够快。

现在需要根据以往员工取餐的统计信息,计算出一个刚好能达成排队时间为0的最低供餐速度。即,食堂在每个单位时间内必须至少做出多少价盒饭才能满足要求。

输入描述

第1行为一个正整数N,表示食堂开餐时长。

  • 1 ≤ N ≤ 1000

第2行为一个正整数M,表示开餐前食堂已经准备好的盒饭份数。

  • P1 ≤ M ≤ 1000

第3行为N个正整数,用空格分隔,依次表示开餐时间内按时间顺序每个单位时间进入食堂取餐的人数Pi。

  • 1 ≤ i ≤ N
  • 0 ≤ Pi ≤ 100
输出描述

一个整数,能满足题目要求的最低供餐速度(每个单位时间需要做出多少份盒饭)。

备注
  • 每人只取一份盒饭。
  • 需要满足排队时间为0,必须保证取餐员工到达食堂时,食堂库存盒饭数量不少于本次来取餐的人数。
  • 第一个单位时间来取餐的员工只能取开餐前食堂准备好的盒饭。
  • 每个单位时间里制作的盒饭只能供应给后续单位时间来的取餐的员工。
  • 食堂在每个单位时间里制作的盒饭数量是相同的。
用例
输入3
14
10 4 5
输出3
说明

本样例中,总共有3批员工就餐,每批人数分别为10、4、5。


开餐前食堂库存14份。

食堂每个单位时间至少要做出3份餐饭才能达成排队时间为0的目标。具体情况如下:

  1. 第一个单位时间来的10位员工直接从库存取餐。取餐后库存剩余4份盒饭,加上第一个单位时间做出的3份,库存有7份
  2. 第二个单位时间来的4员工从库存的7份中取4份。取餐后库存剩余3份盒饭,加上第二个单位时间做出的3份,库存有6份。
  3. 第三个单位时间来的员工从库存的6份中取5份,库存足够。

如果食堂在单位时间只能做出2份餐饭,则情况如下:

  1. 第一个单位时间来的10位员工直接从库存取餐。取餐后库存剩余4份盒饭,加上第一个单位时间做出的2份,库存有6份
  2. 第二个单位时间来的4员工从库存的6份中取4份。取餐后库存剩余2份盒饭,加上第二个单位时间做出的2份,库存有4份.
  3. 第三个单位时间来的员工需要取5份,但库存只有4份,库存不够。
题目解析

本题主要考察二分法。

排队前的初始盒饭数为m,假设每单位时间新增盒饭数add个

对于第一批到来的食客p[0],由于题目已将说了m >= p[0],因此盒饭数是足够的,剩余盒饭数 m -= p[0]

第二批食客到来前,新增了add个盒饭,因此盒饭数变为 m += add

第二批食客p[1]到来后,需要检查m >= p[1]是否成立,如果成立,则当前add满足第一批食客要求,做到0等待。如果不满足,则add不是一个符合要求。

按此逻辑,只要add保证,所有批次的食客都能0等待,那么add就是一个符合要求的解。

这种符合要求的add有很多个,我们需要取其中最小的add作为题解。

我们可以思考下:

add的最小值可以取多少?

比如当初始盒饭数m超级大,即每个单位不用新增盒饭数,都可以满足所有批次食客0等待,那么add可以取0。而0就是add能取得得最小值。

add的最大值可以取多少?

是否存在一个add,必然能满足所有批次食客0等待呢?答案是有的,即add取max(p),这样必然能够保证每个批次的食客都0等待。

我们可以二分取0~max(p)之间的值mid,作为add去尝试发饭,如果:

  • mid可以让所有批次的食客都能0等待,则mid就是一个可能解,但不一定是最优解,因此我们需要记录ans =mid,并且继续尝试更小的mid,即让max = mid - 1
  • mid不可以让所有批次的食客0等待,则mid取小了,因此下一轮二分,我们应该让mid取大一点,即min = max + 1

最后返回ans即可。

Java算法源码
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); int[] p = new int[n]; for (int i = 0; i < n; i++) p[i] = sc.nextInt(); System.out.println(getResult(n, m, p)); } public static long getResult(int n, int m, int[] p) { int min = 0; // 每个单位时间最少增加盒饭数量 int max = Arrays.stream(p).max().orElse(0); // 每个单位时间最多增加盒饭数量 // 记录题解 int ans = 0; // 二分 while (min <= max) { int mid = (min + max) >> 1; // 检查每个单位时间增加mid份盒饭,是否可以满足0等待 if (check(m, mid, p)) { // 可以满足的话,则mid就是一个可能解 ans = mid; // 继续查找更优解 max = mid - 1; } else { // 不满足的话,则说明mid取小了,下一轮应该取更大的mid min = mid + 1; } } return ans; } public static boolean check(int m, int add, int[] p) { m -= p[0]; // P1 ≤ M ≤ 1000,因此这里 m - p[0] 必然大于等于 0 for (int i = 1; i < p.length; i++) { m += add; if (m >= p[i]) m -= p[i]; else return false; } return true; } }
JS算法源码
/* JavaScript Node ACM模式 控制台输入获取 */ const readline = require("readline"); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); const lines = []; rl.on("line", (line) => { lines.push(line); if (lines.length === 3) { const n = parseInt(lines[0]); const m = parseInt(lines[1]); const p = lines[2].split(" ").map(Number); console.log(getResult(n, m, p)); lines.length = 0; } }); function getResult(n, m, p) { let min = 0; // 每个单位时间最少增加盒饭数量 let max = Math.max(...p); // 每个单位时间最多增加盒饭数量 // 记录题解 let ans = 0; // 二分 while (min <= max) { const mid = (min + max) >> 1; // 检查每个单位时间增加mid份盒饭,是否可以满足0等待 if (check(m, mid, p)) { // 可以满足的话,则mid就是一个可能解 ans = mid; // 继续查找更优解 max = mid - 1; } else { // 不满足的话,则说明mid取小了,下一轮应该取更大的mid min = mid + 1; } } return ans; } function check(m, add, p) { m -= p[0]; // P1 ≤ M ≤ 1000,因此这里 m - p[0] 必然大于等于 0 for (let i = 1; i < p.length; i++) { m += add; if (m >= p[i]) m -= p[i]; else return false; } return true; }
Python算法源码
# 输入获取 n = int(input()) m = int(input()) p = list(map(int, input().split())) def check(m, add, p): m -= p[0] # P1 ≤ M ≤ 1000,因此这里 m - p[0] 必然大于等于 0 for i in range(1, len(p)): m += add if m >= p[i]: m -= p[i] else: return False return True # 算法入口 def getResult(): # 每个单位时间最少增加盒饭数量 low = 0 # 每个单位时间最多增加盒饭数量 high = max(p) # 记录题解 ans = 0 # 二分 while low <= high: mid = (low + high) >> 1 # 检查每个单位时间增加mid份盒饭,是否可以满足0等待 if check(m, mid, p): # 可以满足的话,则mid就是一个可能解 ans = mid # 继续查找更优解 high = mid - 1 else: # 不满足的话,则说明mid取小了,下一轮应该取更大的mid low = mid + 1 return ans # 算法调用 print(getResult())
C算法源码
#include <stdio.h> #define MAX_SIZE 1000 #define MAX(a,b) a > b ? a : b int getResult(int n, int m, int* p); int check(int m, int add, int* p, int p_size); int arr_max(int* arr, int arr_size); int main() { int n; scanf("%d", &n); int m; scanf("%d", &m); int p[MAX_SIZE]; for(int i=0; i<n; i++) { scanf("%d", &p[i]); } printf("%d\n", getResult(n, m, p)); return 0; } int getResult(int n, int m, int* p) { // 每个单位时间最少增加盒饭数量 int min = 0; // 每个单位时间最多增加盒饭数量 int max = arr_max(p, n); // 记录题解 int ans = 0; // 二分 while(min <= max) { int mid = (min + max) >> 1; // 检查每个单位时间增加mid份盒饭,是否可以满足0等待 if(check(m, mid, p, n)) { // 可以满足的话,则mid就是一个可能解 ans = mid; // 继续查找更优解 max = mid - 1; } else { // 不满足的话,则说明mid取小了,下一轮应该取更大的mid min = mid + 1; } } return ans; } int check(int m, int add, int* p, int p_size) { // P1 ≤ M ≤ 1000,因此这里 m - p[0] 必然大于等于 0 m -= p[0]; for(int i=1; i<p_size; i++) { m += add; if(m >= p[i]) { m -= p[i]; } else { return 0; } } return 1; } int arr_max(int* arr, int arr_size) { int ans = arr[0]; for(int i=1; i<arr_size; i++) { ans = MAX(ans, arr[i]); } return ans; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/27 5:16:21

制造业七大核心系统盘点——ERP、MES、WMS、SCM、PLM、SCADA、QMS

我这几年跑工厂、聊老板、跟信息化负责人沟通&#xff0c;听到最多的一句话不是我们没系统&#xff0c;而是&#xff1a;ERP 上了&#xff0c;车间还是一团乱MES 买了&#xff0c;数据没人信仓库有系统&#xff0c;库存还是对不上系统一堆&#xff0c;但问题一个没少这时候很多…

作者头像 李华
网站建设 2026/2/16 13:12:36

前端使用docker打包nuxt官网项目

安装docker的文章在另一篇&#xff1a;https://blog.csdn.net/m0_69727853/article/details/154741168?spm1001.2014.3001.5501 1. 查看docker是否安装成功 docker -v 2. 如果显示没有docker&#xff0c;查看当前的环境变量是否正确 tips提示&#xff1a;如果找不到安装的doc…

作者头像 李华
网站建设 2026/2/16 0:10:49

Java计算机毕设之基于Java+springboot的寿险公司人力资源管理系统基于SpringBoot的人力资源管理系统(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/2/25 7:23:05

PolarDB-X 企业版分布式集群部署文档

目录PolarDB-X 企业版分布式集群部署文档快速连接快速连接命令集群信息集群状态Pod 列表服务列表镜像版本安装步骤1. 安装 Helm2. 创建命名空间3. 添加 Helm 仓库并安装 Operator4. 获取最新镜像版本5. 创建集群配置文件6. 部署集群7. 监控部署进度8. 获取连接密码集群架构架构…

作者头像 李华
网站建设 2026/2/25 0:30:40

计算机Java毕设实战-基于springboot的社区协作与资源共享系统社区闲置资源交易与共享系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华