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

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

相关文章

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. 将日期转换为二进制表示 思路分析

华为OD机试真题-学生方阵-2024年OD统一考试(E卷)

题目描述 学校组织活动,将学生排成一个矩形方阵。 请在矩形方阵中找到最大的位置相连的男生数量。这个相连位置在一个直线上,方向可以是水平的,垂直的,成对角线的或者呈反对角线的。 注:学生个数不会超过10000 输入描述 输入的第一行为矩阵的行数和列数, 接下来的 n行为矩阵元素,元素间用""分隔。 输出描述 输出一个整数,表示矩阵中最长的位

2024年AMC10美国数学竞赛倒计时两个月:吃透1250道真题和知识点(持续)

根据通知,2024年AMC10美国数学竞赛的报名还有两周,正式比赛还有两个月就要开始了。计划参赛的孩子们要记好时间,认真备考,最后冲刺再提高成绩。 那么如何备考2024年AMC10美国数学竞赛呢?做真题,吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。通过做真题,可以帮助孩子找到真实竞赛的感觉,而且更加贴近比赛的内容,可以通过真题查漏补缺,更有针对性的补齐知识的短板。

牛客小白月赛100部分题解

比赛地址:牛客小白月赛100_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ A.ACM中的A题 #include<bits/stdc++.h>using namespace std;#define ll long long#define ull = unsigned long longvoid solve() {ll a,b,c;cin>>a>>b>