【二分】[USACO 2010 Feb S]Chocolate Eating

news/2024/10/5 1:37:14

https://ac.nowcoder.com/acm/contest/22353/E
有的时候50%通不过真的很无助orz

二分查找最小幸福值: 我们希望找出一个最大的 mid,即最小幸福值,使得 Bessie 能够在 d 天内吃完巧克力,并且每天的幸福值都不低于这个 mid。

我们可以通过二分查找的方式来确定这个 mid。mid 的初始范围是 [0, 1e12],因为幸福值可能很大。
每次我们计算出 mid 的值后,使用 check() 函数来验证是否能够在 d 天内满足每天的幸福值都不低于 mid。如果可以,我们尝试增大 mid;如果不行,我们尝试减小 mid。

注意 如果有剩余巧克力,需要分配到最后一天,不能有剩余

  1. 设定二分查找的上下界 low = 0, high = 1e12
  2. 进行二分查找:
    a. 计算 mid = (low + high) / 2
    b. 使用 check(mid) 判断是否可以分配巧克力:
    - 如果可以满足最小幸福值为 mid,更新结果,并尝试更大的 mid(low = mid + 1)
    - 如果不可以满足,尝试更小的 mid(high = mid - 1)
  3. 输出二分查找的结果(最大最小幸福值)
  4. 输出巧克力的分配方案
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;ll n, d;
ll a[50050], happiness[50050], ans[50010];int check(ll mid) {ll i, j, count, sum, tmp[50010];count = sum = 1;happiness[1] = 0;for(i = 1; i <= d; i++) {while(happiness[i] < mid) {if(count > n) return -1;  // 巧克力吃完了,返回 -1tmp[count] = i;  // 记录巧克力被吃掉的天数happiness[i] += a[count++];  // 增加当前天的幸福值}happiness[i + 1] = happiness[i] / 2;  // 下一天的幸福值是前一天的一半}for(i = 1; i < count; i++) ans[i] = tmp[i];  // 记录巧克力的分配天数for(i = count; i <= n; i++) ans[i] = d;  // 剩余巧克力分配到最后一天return 1;
}int main() {cin >> n >> d;for(int i = 1; i <= n; i++) cin >> a[i];ll l = 0, r = 1e12;ll result = 0;// 二分查找寻找最大的最小幸福值while(l <= r) {ll mid = (l + r) >> 1;if(check(mid) == 1) result = mid, l = mid + 1;else r = mid - 1;}cout << result << endl;for(int i = 1; i <= n; i++) cout << ans[i] << endl;
}

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

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

相关文章

财务知识-20个常用的会计分录

财务知识——20个常用的会计分录

[rCore学习笔记 029] 动态内存分配器实现-以buddy_system_allocator源码为例

在上一部分,我们讲了动态内存分配器的原理是维护一个堆,而且是实现各种连续内存分配方法. 但是上一部分是直接通过引用了buddy_system_allocator来解决的问题. 那么对于内存分配算法有兴趣的我,还是决定看一下源码,总之人是咸鱼但是还是需要有梦想. 人生这么不顺,若是连梦想都没…

工具推荐:搜索和删除Windows上重复文件的神器:AllDup

​ AllDup是一款免费的重复文件查找工具,它能够帮助用户快速识别和管理计算机上的重复文件。这些文件可能包括文本、图片、音乐、视频等多种类型。AllDup使用快速查询算法,可以有效地搜索和定位重复项,从而帮助用户释放硬盘空间,组织文件结构,并提高系统性能。 下载地址:h…

工具推荐:完全免费的电脑 Epub 阅读器软件 Jane Reader

​ Jane Reader是一款现代化的电子书阅读器,支持EPUB格式,旨在提供类似于纸质书籍的阅读体验。它具有简洁、清爽的界面,支持自动多栏、多主题、直排模式等功能,并提供了一系列个性化设置,如自定义边距、行高、字体大小等。Jane Reader还内置了常用字体,如宋体、黑体、仿宋…

工具推荐:开源免费的文件备份恢复工具:Kopia

​ Kopia是一个开源的备份和恢复工具,适用于Windows、macOS和Linux操作系统。它提供了命令行界面(CLI)和图形用户界面(GUI),支持增量备份、客户端端到端加密、数据压缩和重复数据删除等功能。Kopia的设计注重安全性和效率,支持多种存储后端,如本地磁盘、网络文件系统或…

工具推荐:最佳快捷键启动、控制软件:HotkeyP

​HotkeyP是一款功能强大的热键管理软件,它允许用户自定义键盘快捷键来执行各种操作,如打开文件、运行程序、控制系统命令等。软件提供了高度的个性化定制,用户可以根据自己的工作流程和习惯来设置快捷键,从而提高工作效率。此外,HotkeyP还支持宏命令,用户可以通过宏来自…

博客网站搭建

关于我的博客网站搭建过程自定义博客网站搭建教程 搭建效果 浏览网址:https://www.cnblogs.com/Love-XiaoMeng前期准备博客园:你需要在此注册一个账号,同时你需要在博客园右上角开通我的博客然后你需要在博客后台管理网站中完成好相应设置如图,同时你需要注意一定要开启JS权…

FM的正交解调法

1.FM的模拟调制过程 ​ FM信号是一种频率调制信号,其携带的信息保存在其信号的频率中,通过改变载波的频率来实现基带数据的传输。 其函数表达式如下: \[s(t) = A*cos(w_c*t + K_f*\int m(\tau) d\tau) \]其中: A:表示载波幅度。 \(m(\tau)\):表示基带信号。 \(w_c\):表示载…