华为OD机考算法题:食堂供餐

news2024/10/6 16:19:51

目录

题目部分

解析与思路

代码实现


题目部分

题目食堂供餐
题目说明某公司员工食堂以盒饭方式供餐。为将员工取餐排队时间降低为0,食堂的供餐速度必须要足够快。现在需要根据以往员工取餐的统计信息,计算出一个刚好能达成排队时间为0的最低供餐速度。即,食堂在每个单位时间内必须至少做出多少份盒饭才能满足要求。
输入描述第1行为一个正整数N,表示食堂开餐时长。1 <= N <= 1000。
第2行为一个正整数M,表示开餐前食堂已经准备好的盒饭份数。pi <= M <= 1000。
第3行为N个正整数,用空格分隔,依次表示开餐时间内按时间顺序每个单位时间进入食堂取餐的人数Pi。1 <=i<= N,0<= Pi<=100。
输出描述一个整数,能满足题目要求的最低供餐速度(每个单位时间需要做出多少份盒饭)。
补充说明每人只取一份盒饭。
需要满足排队时间为0,必须保证取餐员工到达食堂时,食堂库存盒饭数量不少于本次来取餐的人数。
第一个单位时间来取餐的员工只能取开餐前食堂准备好的盒饭。
每个单位时间里制作的盒饭只能供应给后续单位时间来的取餐的员工。
食堂在每个单位时间里制作的盒饭数量是相同的。
------------------------------------------
示例
示例1
输入3
14
10 4 5
输出3
说明本样例中,总共有3批员工就餐,每批人数分别为10、4、5。
开餐前食堂库存14份。
 
食堂每个个单位时间至少要做出3份餐饭才能达成排队时间为0的目标。具体情况如下:
第一个单位时间来的10位员工直接从库存取餐。取餐后库存剩余4份盒饭,加上第一个单位时间做出的3份,库存有7份。
第二个单位时间来的4员工从库存的7份中取4份。取餐后库存剩余3份盒饭,加上第二个单位时间做出的3份,库存有6份。
第三个单位时间来的员工从库存的6份中取5份,库存足够。
  
如果食堂在单位时间只能做出2份餐饭,则情况如下:
第一个单位时间来的10位员工直接从库存取餐。取餐后库存剩余4份盒饭,加上第一个单位时间做出的2份,库存有6份。
第二个单位时间来的4员工从库存的6份中取4份。取餐后库存剩余2份盒饭,加上第二个单位时间做出的2份,库存有4份。
第三个单位时间来的员工需要取5份,但库存只有4份,库存不够。

解析与思路

题目解读

此题中,第1行是就餐员工的总批数,设为 count;第2行是初始库存数,设为 stockQty;第3行是每批次的份数,假设每批次的数字放到数组 dinners 中,那么dinners的长度为count,且dinners[i] 即为第 ( i + 1 ) 个批次所需的份数(备注:批次起始值为1,放到数组的第 0 个元素)。

假设题目中最低的供餐速度为 x(x为正整数),那么 对于所有的 i ( 0 <= i <= count),x 必须满足 ( stockQty + x * i) >=  \sum_{idx=0}^{i} dinners[idx]。其中, \sum_{idx=0}^{i} dinners[idx] 代表着dinners数组的前 i 个元素之和,即 \sum_{idx=0}^{i} dinners[idx] = dinners[0] + dinners[1] + … + dinners[i]。

分析思路

设置 x 的初始值为0。

根据不等式 ( stockQty + x * i) >=  \sum_{idx=0}^{i} dinners[idx],对于 i, 从 0 到 ( count -1 ) ,判断当前的 x 值是否保证不等式成立:

  • 如果不等式成立,则不进行任何操作;
  • 如果不等式不成立,即 x 值过小,重新计算 x 的值。x 的新值必定比老值更大。
    我们知道,当 从 0 到 ( i - 1 ), x 的老值都能保证不等式成立,现在 x 的值变大了,不等式的左边比以前更大。这意味着这个不等式对于 x 的新值在 0 到 ( i - 1 )  一定是成立的。

最终计算出的 x 即是题目要求的值。

此算法只需要遍历一次 dinners 数组,时间复杂度为 o(n);由于使用了辅助数组,其空间复杂度也为o(n)。


代码实现

Java代码

import java.util.Scanner;

/**
 * 食堂供餐
 * @since 2023.09.05
 * @version 0.1
 * @author Frank
 *
 */
public class Dinners {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		// 第一行输入就餐的批次
		String strCount = sc.nextLine();
		int count = Integer.parseInt( strCount );
		
		// 第二行输入初始库存数
		String strStockQty = sc.nextLine();
		int stockQty = Integer.parseInt( strStockQty );
		
		// 第三行输入每批次所需的午餐份数
		// 此处dinners中的元素都是String,后面需要转换成int处理
		String strDinners = sc.nextLine();
		String[] dinners = strDinners.split(" "); // dinners.length == count
				
		int currentSumNeeded = 0;
		int x = 0;
		int currentStock = stockQty;
		for( int i = 0; i < count; i ++ )
		{
			currentStock = stockQty + i * x;
			currentSumNeeded += Integer.parseInt( dinners[i] );	
			if( currentStock < currentSumNeeded )
			{
				// 计算最小的 x(新值必定比当前的x大),确保 currentStock >= currentSumNeeded
				int diff = currentSumNeeded - stockQty;
				int tmpX =  diff / i;
				if( diff % i != 0 )
				{
					tmpX ++;
				}
				x = tmpX;
			}
		}
		System.out.println( x );
	}
}

JavaScript代码

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void async function() {
    let input = [];
    while (line = await readline()) {
        input.push(line);
    }

    // 第一行,进餐的批次
    var strCount = input[0];
    var count = parseInt(strCount);

    // 第二行,初始库存数
    var strStockQty = input[1];
    var stockQty = parseInt(strStockQty);

    // 第三行,每批次需要的份数
    var strDinners = input[2].split(" ");

    var currentSumNeeded = 0;
    var x = 0;
    var currentStock = stockQty;
    for (var i = 0; i < count; i++) {
        currentStock = stockQty + i * x;
        currentSumNeeded += parseInt(strDinners[i]);
        if (currentStock < currentSumNeeded) {
            // 计算最小的 x(新值必定比当前的x大),确保 currentStock >= currentSumNeeded
            var diff = currentSumNeeded - stockQty;
            var tmpX = parseInt(diff / i);
            if (diff % i != 0) {
                tmpX++;
            }
            x = tmpX;
        }
    }
    console.log(x);
}();

(完)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/978249.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PPO算法

PPO算法 全称Proximal Policy Optimization&#xff0c;是TRPO(Trust Region Policy Optimization)算法的继承与简化&#xff0c;大大降低了实现难度。原论文 算法大致流程 首先&#xff0c;使用已有的策略采样 N N N条轨迹&#xff0c;使用这些轨迹上的数据估计优势函数 A ^ …

算法做题记录

一、递推 95.费解的开关 #include<iostream> #include<cstring> using namespace std;const int N 8;char a[N][N],s[N][N]; int T; int ans20,cnt; int dir[5][2]{1,0,-1,0,0,1,0,-1,0,0};void turn(int x,int y) {for(int i0;i<5;i){int xx xdir[i][0];in…

数学建模--Topsis评价方法的Python实现

目录 1.算法流程简介 2.算法核心代码 3.算法效果展示 1.算法流程简介 """ TOPSIS(综合评价方法):主要是根据根据各测评对象与理想目标的接近程度进行排序. 然后在现有研究对象中进行相对优劣评价。 其基本原理就是求解计算各评价对象与最优解和最劣解的距离…

文字验证码:简单有效的账号安全守卫!

前言 文字验证码不仅是一种简单易懂的验证方式&#xff0c;同时也是保护您的账号安全的重要工具。通过输入正确的文字组合&#xff0c;您可以有效地确认自己的身份&#xff0c;确保只有真正的用户才能访问您的账号。 HTML代码 <script src"https://cdn6.kgcaptcha.…

rust编译出错:error: failed to run custom build command for `ring v0.16.20`

安装 Visual Studio&#xff0c;确保选择 —.NET 桌面开发、使用 C 的桌面开发和通用 Windows 平台开发。显示已安装的工具链rustup show。然后通过运行更改和设置工具链rustup default stable-x86_64-pc-windows-msvc。 另外是想用clion进行调试rust 需要你按下面配置即可解…

【Spring MVC】统一功能处理

一、登录验证 登录验证通过拦截器实现&#xff0c;拦截器就是在用户访问服务器时&#xff0c;预先拦截检查一下用户的访问请求。 没有拦截器时&#xff0c;用户访问服务器的流程是&#xff1a;用户–>controller–>service–>Mapper。有拦截器时&#xff0c;用户访问…

自旋锁和读写锁

目录 一、自旋锁 1.自旋锁和挂起等待锁 2.自旋锁的接口 二、读写锁 1.读者写者模型与读写锁 2.读写锁接口 3.加锁的原理 4.读写优先级 一、自旋锁 1.自旋锁和挂起等待锁 互斥锁的类型有很多&#xff0c;我们之前使用的锁实际上是互斥锁中的挂起等待锁。互斥锁比较有代…

JMeter(三十九):selenium怪异的UI自动化测试组合

文章目录 一、背景二、JMeter+selenium使用过程三、总结一、背景 题主多年前在某社区看到有人使用jmeter+selenium做UI自动化测试的时候,感觉很是诧异、怪异,为啥?众所周知在python/java+selenium+testng/pytest这样的组合框架下,为啥要选择jmeter这个东西[本身定位是接口测…

基于微信小程序的智能垃圾分类回收系统,附源码、教程

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 1 简介 视频演示地址&#xff1a; 基于微信小程序的智能垃圾分类回收系统&#xff0c;可作为毕业设计 小…

《C++ Primer》第2章 变量(一)

参考资料&#xff1a; 《C Primer》第5版《C Primer 习题集》第5版 2.1 基本内置类型&#xff08;P30&#xff09; C 定义的基本类型包括算术类型&#xff08;arithmetic type&#xff09;和空类型&#xff08;void&#xff09;&#xff0c;其中算术类型包括字符、整型、布尔…

postgresql-类型转换函数

postgresql-类型转换函数 简介CAST 函数to_date函数to_timestampto_charto_number隐式类型转换 简介 类型转换函数用于将数据从一种类型转换为另一种类型。 CAST 函数 CAST ( expr AS data_type )函数用于将 expr 转换为 data_type 数据类型&#xff1b;PostgreSQL 类型转 换…

《86盒应用于家居中控》——实现智能家居的灵动掌控

近年来&#xff0c;智能家居产品受到越来越多消费者的关注&#xff0c;其便捷、舒适的生活方式让人们对未来生活充满期待。作为智能家居方案领域的方案商&#xff0c;启明智显生产设计的86盒凭借出色的性能和良好的用户体验&#xff0c;成功应用于家居中控系统&#xff0c;让家…

Gof23设计模式之策略模式

1.概述 该模式定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以相互替换&#xff0c;且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式&#xff0c;它通过对算法进行封装&#xff0c;把使用算法的责任和算法的实现分割开来&#xff0c;…

剑指 Offer 43. 1~n 整数中 1 出现的次数(困难)

题目&#xff1a; class Solution { public:int countDigitOne(int n) {// mulk 表示 10^k// 在下面的代码中&#xff0c;可以发现 k 并没有被直接使用到&#xff08;都是使用 10^k&#xff09;// 但为了让代码看起来更加直观&#xff0c;这里保留了 klong long mulk 1;int…

Text Workflow for Mac,简单易用的文本转换工具

如果你需要一个能够将文本转换成多种语言和文件格式的工具&#xff0c;那么Text Workflow for Mac将是你的不二之选。 这个软件支持多种语言翻译和多种文件格式转换&#xff0c;让你可以轻松地将文本转换成你需要的形式。而且&#xff0c;它的操作非常简单&#xff0c;只需要几…

精讲算法的时间复杂度

目录 一、算法效率 1.算法效率 1.1如何衡量一个算法的好坏 1.2算法的复杂度 二、时间复杂度 1.时间复杂度的概念 2.大O的渐进表示法 3.常见时间复杂度的计算举例 三、空间复杂度 一、算法效率 1.算法效率 1.1如何衡量一个算法的好坏 long long Fib(int N) {if(N <…

Day6:浅谈useState

「目标」: 持续输出&#xff01;每日分享关于web前端常见知识、面试题、性能优化、新技术等方面的内容。 Day6-今日话题 谈谈react hooks中的useState &#xff0c;将从以下七个角度介绍&#xff1a; 用法 参数 返回值 作用 工作原理 优缺点 注意点 用法 useState 是一个函数&a…

Hugging News #0904: 登陆 AWS Marketplace

每一周&#xff0c;我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新&#xff0c;包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等&#xff0c;我们将其称之为「Hugging News」。本期 Hugging News 有哪些有趣的消息&#xff0…

VMware虚拟机安装CentOS7设置静态ip

vim /etc/sysconfig/network-scripts/ifcfg-ens33修改BOOTPROTO的值为static 增加最后那四项&#xff0c;参数在编辑&#xff0c;虚拟网络编辑器里面看

合宙Air724UG LuatOS-Air LVGL API控件-滑动条 (Slider)

滑动条 (Slider) 滑动条看起来和进度条是有些是有些像&#xff0c;但不同的是滑动条可以进行数值选择。 示例代码 -- 回调函数 slider_event_cb function(obj, event)if event lvgl.EVENT_VALUE_CHANGED then local val (lvgl.slider_get_value(obj) or "0")..&…