1 条题解
-
0
自动搬运
来自洛谷,原作者为

未来姚班zyl
欢迎加入粉丝团!https://www.luogu.com.cn/team/72518|AFO搬运于
2025-08-24 21:15:00,当前版本为作者最后更新于2023-06-08 20:01:12,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
Source & Knowledge
2023 年 6 月语言月赛,由洛谷网校入门计划/基础计划提供。
题目大意
zyl 按顺序拆开若干封信,信由信纸,信封和礼物三部分组成,给定了信纸与信封的单位质量,信纸与信封的面积,按照给定规则求出惊喜值,并给出过程中的最大值和最终的惊喜值。
题目分析
本题考察题目理解和代码实现能力。
本题题面还是不短的,需要认真读题以免丢失细节。我们来依次处理需要的信息。
首先判断有无礼物。显然,对于每一封信,礼物的重量等于总重量减去信封信纸的总重量。对于信封信纸,它们各自的重量等于单位面积的重量乘上它们的面积。故礼物的重量 。如果 则说明有礼物,否则没有礼物。
接下来要处理连续有/无礼物的信封的数量。这里我们可以开两个变量 和 ,分别表示连续有礼物的信封的数量和连续没有礼物的信封的数量。当现在处理的信封中有礼物时,将 置零, 增加一;反之,将 置零, 增加一。这样就能时刻维护连续有/无礼物的信封的数量了。
接下来就是计算惊喜值了。如果没有礼物时,按照题意,只需判断 是否达到了 。如果达到了,惊喜就得折半(即除以二),向下取整。由于 c++ 中正数的运算本就是向下取整,所以可以放心除。如果有礼物,按照题意,首先将惊喜值加上 。然后,判断 与信封信纸的总质量 的大小关系。如果 更大,则惊喜值需加上 ,向上取整。这里向上取整可以写成 。如果 达到了 ,则惊喜值翻倍(即乘以二)。然后用一个变量记录过程中的最大值就可以了。
注意惊喜值可能会达到 ,所以要用 long long 类型存储。
核心代码如下:
for(int i=1;i<=n;i++){ scanf("%d%d%d",&S,&s,&M); int m = M - S * x + s * y; if(m){ cnta++,cntb = 0; now += m; if(m > S * x - s * y)now += (m + 1) / 2; if(cnta >= a)now *= 2; ans = max(ans,now); } else { cntb++,cnta = 0; if(cntb >= b)now /= 2; } } cout <<ans<<" "<<now;视频题解
- 1
信息
- ID
- 8780
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 1
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者