大礼包 - 华为机试真题题解

2024-02-05 04:44

本文主要是介绍大礼包 - 华为机试真题题解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

考试平台: 时习知

分值: 200分(第二题)

考试时间: 2024-01-31 (两小时)

alt

题目描述

某公司针对新用户推出大礼包,从任意一天注册开始,连续登陆 x 天,每天可以领取一定的金币。

领取金币的数量与该公司新设计的虚拟世界的日历相关,该日历一年有 n 个月,第 i 个月有 d i d_i di 天,每一年都一样。

在每个月第一天会得到1个金币,第二天会得到 2个金币,第三天会得到 3 个金币…,后面依次类推。

请计算新用户注册后连续登陆 x 天,最多可以获取多少金币。

输入

第一行包含两个整数 nx ($1 \le n \le 2 * 10^5 $),分别表示一年中的月数和连续登陆的天数。

第二行包含n 个整数 d l , d 2 , . . . , d n d_l,d_2,...,d_n dl,d2,...,dn 、 $di $ 表示第 i 个月的天数 ( 1 ≤ d i ≤ 1 0 6 1 \le d_i \le 10^6 1di106)。

用例保证, 1 ≤ x ≤ d 1 + d 2 + . . . + d n 1 \le x \le d_1 + d_2 + ... + d_n 1xd1+d2+...+dn

输出

打印新用户连续登陆x天最多可以获取的金币数量。

示例1

输入:
3 2
1 3 2输出:
5解释: 
一年中每天获取的金币数是{1,1,2,3,1} (对应每个月中的天数)。如果在一年中的第3天开始注册登陆,最多可以获取 2+3=5个金币。

示例2

输入:
3 6
3 3 3输出:
12解释: 
一年中每天获取的金币数是{1,2,3,1,2,3,1,2,3} (对应每个月中的天数)。如果在一年中的第3天开始注册登陆,最多可以获取3+1+2+3+1十2=12 个金币。

示例3

输入:
5 6
4 2 3 1 3输出:
15解释: 
一年中每天获取的金币数是{1,2,3,4,1,2,1,2,3,1,1,2,3} (对应每个月中的天数)。如果在一年中的第12天开始注册登陆,最多可以获2+3+1+2+3+4=15个金币。

Python 题解

该题使用滑动窗口求解。

解题思路:

  1. 由于题目中有一年的日历,考虑将月份 * 2 进行处理,相当于一个环,方便处理从年底再往后走的情况。
  2. 使用两个指针,left_idxright_idx 分别表示左边界和右边界,left_numright_num 分别表示左边界和右边界当前所在月份的天数。
  3. 首先,扩大窗口到 x,即计算连续登陆 x 天所能获取的金币数。
  4. 然后,保持窗口大小,尝试将最大金币数记录下来。通过不断右移左右指针,计算窗口内的金币数,同时记录最大金币数。
  5. 最后返回最大金币数。

Python 题解

from typing import Listdef solve(n: int, x: int, d: List[int]) -> int:coin_sum = 0  # 当前金币数left_idx, left_num = 0, 1  # 左边界right_idx, right_num = 0, 1  # 右边界# 一、 扩大窗口到 xwindow = 0while window < x and right_idx < n:if right_num == 1 and window + d[right_idx] <= x:coin_sum += (1 + d[right_idx]) * d[right_idx] / 2window += d[right_idx]right_idx += 1else:   # 按天进行右移右指针if right_num <= d[right_idx]:coin_sum += right_numwindow += 1right_num += 1if right_num > d[right_idx]:  # 当前月已过,跳到下个月right_idx += 1right_num = 1# 二、保持窗口(同时左右指针右移动),尝试将最大金币数记录下来# 数据量较大,因此不能一步一步的移动max_coin = coin_sum  # 最大金币数while right_idx < n:left_step = d[left_idx] - left_num + 1     # 左指针可以移动的步数right_step = d[right_idx] - right_num + 1  # 右指针可以移动的步数step = min(left_step, right_step)  # 取最小步数# 总金币变化 = 右侧增加的金币 - 左侧减少的金币# coin_change = (right_num + right_num + step) * step / 2 - (left_num + left_num + step) * step / 2# = (right_num - left_num) * stepcoin_sum += (right_num - left_num) * stepmax_coin = max(max_coin, coin_sum)# 窗口向右移动 stepleft_num += stepright_num += stepif left_num > d[left_idx]:  # 当前月已过,跳到下个月left_idx += 1left_num = 1if right_num > d[right_idx]:  # 当前月已过,跳到下个月right_idx += 1right_num = 1return int(max_coin)if __name__ == "__main__":# 一年中的月数和连续登陆的天数n, x = map(int, input().split())# 每月份的天数d = list(map(int, input().split()))# 因为从年底再往后走又走到年初, 相当于一个环# 为了能遍历到所有的情况,将月份 * 2 进行处理print(solve(2 * n, x, d + d))

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

这篇关于大礼包 - 华为机试真题题解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/679779

相关文章

售价599元起! 华为路由器X1/Pro发布 配置与区别一览

《售价599元起!华为路由器X1/Pro发布配置与区别一览》华为路由器X1/Pro发布,有朋友留言问华为路由X1和X1Pro怎么选择,关于这个问题,本期图文将对这二款路由器做了期参数对比,大家看... 华为路由 X1 系列已经正式发布并开启预售,将在 4 月 25 日 10:08 正式开售,两款产品分别为华

定价129元!支持双频 Wi-Fi 5的华为AX1路由器发布

《定价129元!支持双频Wi-Fi5的华为AX1路由器发布》华为上周推出了其最新的入门级Wi-Fi5路由器——华为路由AX1,建议零售价129元,这款路由器配置如何?详细请看下文介... 华为 Wi-Fi 5 路由 AX1 已正式开售,新品支持双频 1200 兆、配有四个千兆网口、提供可视化智能诊断功能,建

你的华为手机升级了吗? 鸿蒙NEXT多连推5.0.123版本变化颇多

《你的华为手机升级了吗?鸿蒙NEXT多连推5.0.123版本变化颇多》现在的手机系统更新可不仅仅是修修补补那么简单了,华为手机的鸿蒙系统最近可是动作频频,给用户们带来了不少惊喜... 为了让用户的使用体验变得很好,华为手机不仅发布了一系列给力的新机,还在操作系统方面进行了疯狂的发力。尤其是近期,不仅鸿蒙O

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

机试算法模拟题 服务中心选址

题目描述 一个快递公司希望在一条街道建立新的服务中心。公司统计了该街道中所有区域在地图上的位置,并希望能够以此为依据为新的服务中心选址:使服务中心到所有区域的距离的总和最小。 给你一个数组positions,其中positions[i] = [left, right] 表示第 i 个区域在街道上的位置,其中left代表区域的左侧的起点,right代表区域的右侧终点,假设服务中心的位置为loca

C - Word Ladder题解

C - Word Ladder 题解 解题思路: 先输入两个字符串S 和t 然后在S和T中寻找有多少个字符不同的个数(也就是需要变换多少次) 开始替换时: tips: 字符串下标以0开始 我们定义两个变量a和b,用于记录当前遍历到的字符 首先是判断:如果这时a已经==b了,那么就跳过,不用管; 如果a大于b的话:那么我们就让s中的第i项替换成b,接着就直接输出S就行了。 这样

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群 华为云最近正在举办828 B2B企业节,Flexus X实例的促销力度非常大,特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求,一定不要错过这个机会。赶紧去看看吧! 什么是华为云Flexus X实例 华为云Flexus X实例云服务是新一代开箱即用、体

【秋招笔试】9.07米哈游秋招改编题-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新 🍄 题面描述等均已改编,如果和你笔试题看到的题面描述

LeetCode 第414场周赛个人题解

目录 Q1. 将日期转换为二进制表示 原题链接 思路分析 AC代码 Q2. 范围内整数的最大得分 原题链接 思路分析 AC代码 Q3. 到达数组末尾的最大得分 原题链接 思路分析 AC代码 Q4. 吃掉所有兵需要的最多移动次数 原题链接 思路分析 AC代码 Q1. 将日期转换为二进制表示 原题链接 Q1. 将日期转换为二进制表示 思路分析