Luogu P1528 切蛋糕 || SCOI2005 栅栏

假设最多能满足 x x x个人,那么这 x x x个人一定可以是按照每个人吃蛋糕的需求将他们从小到大排序后的前 x x x个人。(有两个人他们吃蛋糕的需求分别为 x 1 x_1 x1 x 2 x_2 x2,且 x 1 < x 2 x_1<x_2 x1<x2,如果 x 2 x_2 x2可以出现在答案中,那么 x 1 x_1 x1也一定能出现在答案中,因为 x 1 x_1 x1的需求比 x 2 x_2 x2小,一定可以填在 x 2 x_2 x2的位置)。所以答案满足单调性,我们可以通过二分答案检查 x x x是否可以满足。二分这部分的复杂度是 l o g 2 1024 = 10 log_2{1024}=10 log21024=10

在这里可以有一个小优化,如果某个人的需求比最大的蛋糕还要大,那么无论如何是无法满足他的,在下面的过程中不需要考虑这个人。

接下来就是通过 d f s dfs dfs来判断是否可以满足 x x x个人的需求。

dfs中我们需要两个参数,分别记录还剩几个人需要满足( p e o peo peo)、这次二分出的答案( m i d mid mid)。当 p e o < 1 peo<1 peo<1时,即已经满足了所有人,这个答案是可行的。接下来开始枚举所有蛋糕,如果这个蛋糕剩下的大小足以满足第 p e o peo peo个人,那就切下这个人需要的大小的蛋糕,递归到下一个人。 n n n的大小是 20 20 20,需要一些剪枝来降低复杂度。

一块蛋糕被切掉一部分之后,如果它剩下的部分连需求最小的人都无法满足,那么就可以说剩下的部分是被浪费的。如果蛋糕有用的部分(总数-浪费)不能满足前 x x x个人需求的和,那么二分的这个答案一定不可行。

如果第 i i i个人的需求和第 i − 1 i-1 i1个人相同,由于我们第 i i i个人已经处理到了第 p o s pos pos块蛋糕,处理第 i − 1 i-1 i1个人的时候,就不需要处理第 p o s pos pos块蛋糕前面的蛋糕了,因为我们在处理第 i i i个人的需求时已经枚举了一遍,前面一定没有符合第 i i i个人需求的。所以可以在 d f s dfs dfs时再加一个参数 p o s pos pos,表示从第 p o s pos pos块蛋糕开始枚举,这个参数就是为了这个剪枝的。

#include <bits/stdc++.h>
#define A 1025using namespace std;
int n, m, cake[A], tcake[A], need[A], cake_max, poss;
int sum[A], cake_sum, waste;
bool dfs(int peo, int x, int pos) {if (peo < 1) return true;if (cake_sum - waste < sum[x]) return false;for (int i = pos; i <= n; i++) {if (need[peo] <= tcake[i]) {tcake[i] -= need[peo];if (tcake[i] < need[1]) waste += tcake[i];if (need[peo] == need[peo - 1]) {if (dfs(peo - 1, x, i)) return true;}else if (dfs(peo - 1, x, 1)) return true;if (tcake[i] < need[1]) waste -= tcake[i];tcake[i] += need[peo];}}return false;
}int main() {cin >> n;for (int i = 1; i <= n; i++) {cin >> cake[i];cake_sum += cake[i];cake_max = max(cake_max, cake[i]);}cin >> m;for (int i = 1; i <= m; i++) cin >> need[i];sort(cake + 1, cake + n + 1);sort(need + 1, need + m + 1);poss = m;for (int i = 1; i <= m; i++) {sum[i] = sum[i - 1] + need[i];if (need[i] > cake_max) {poss = i;break;}}m = poss;int l = 0, r = m, mid, ans;while (l <= r) {mid = (l + r) / 2;memcpy(tcake, cake, sizeof cake);waste = 0;if (dfs(mid, mid, 1)) {l = mid + 1;ans = mid;}else r = mid - 1;}cout << ans << endl;
}

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

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

相关文章

【从零开始的LeetCode-算法】504. 七进制数

给定一个整数 num&#xff0c;将其转化为 7 进制&#xff0c;并以字符串形式输出。 示例 1: 输入: num 100 输出: "202"示例 2: 输入: num -7 输出: "-10"提示&#xff1a; -107 < num < 107 我的解答 class Solution {public String convertT…

大数据存储计算平台EasyMR:大数据集群动态扩缩容,快速提升集群服务能力

在当今的数据驱动时代&#xff0c;组织面临着数据量的爆炸性增长。为了有效管理和存储这些数据&#xff0c;许多组织依赖于 Hadoop 这样的分布式存储系统。Hadoop 集群通过在多个节点上存储数据的冗余副本&#xff0c;提供了高可靠性和可扩展性。然而&#xff0c;随着数据量的不…

【MySQL】提高篇—复杂查询:多表连接(INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN)

在关系数据库中&#xff0c;数据通常分散在多个表中。为了获取相关联的数据&#xff0c;需要使用表连接&#xff08;JOIN&#xff09;操作。 表连接允许我们在一个查询中结合多个表的数据&#xff0c;这在实际应用中非常重要。 例如&#xff0c;在一个电商系统中&#xff0c;…

如何更改MySQL的root密码

前言 在管理数据库时&#xff0c;有时可能会忘记MySQL的root用户密码或需要更改默认设置的密码。以下是在Windows环境下更改MySQL root密码的详细步骤。请注意&#xff0c;这些步骤适用于MySQL 5.7及以上版本&#xff1b;对于其他版本&#xff0c;请参考相应版本的文档。 准备…

倪师学习笔记-天纪-易经入门

1、易经-易的意思 变易、变化简易、简单 2、神、象 神&#xff1a;永恒象&#xff1a;一直变&#xff0c;不会重复&#xff0c;但对应的神一样 3、机锋 突发的、短暂的具有预兆功能的事情 4、先天八卦&#xff08;伏羲八卦&#xff09; 特点&#xff1a;为体&#xff0c…

ChatGPT国内中文版镜像网站整理合集(2024/10/06)

一、GPT中文镜像站 ① yixiaai.com 支持GPT4、4o以及o1&#xff0c;支持MJ绘画 ② chat.lify.vip 支持通用全模型&#xff0c;支持文件读取、插件、绘画、AIPPT ③ AI Chat 支持GPT3.5/4&#xff0c;4o以及MJ绘画 1. 什么是镜像站 镜像站&#xff08;Mirror Site&#xff…

Spring Boot在线考试系统:JavaWeb技术的应用案例

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

几个常值问题导致formality失败debug方法

在做fomality的时候&#xff0c;如果出现寄存器unmatch问题&#xff0c;通常是由于常值推导不一致&#xff0c;导致寄存器被优化。 几个基本定位方法如下&#xff1a; 1.verify r:wrok/top/xyz_reg[0] -constant0 此命令可查看ref中的寄存器是否是常值。 2.guide guide_re…

英飞达医学影像存档与通信系统 WebUserLogin.asmx 信息泄露漏洞复现

0x01 产品简介 英飞达医学影像存档与通信系统 Picture Archiving and Communication System,它是应用在医院影像科室的系统,主要的任务就是把日常产生的各种医学影像(包括核磁,CT,超声,各种X光机,各种红外仪、显微仪等设备产生的图像)通过各种接口(模拟,DICOM,网络…

概率 随机变量以及分布

一、基础定义及分类 1、随机变量 随机变量是一个从样本空间&#xff08;所有可能结果的集合&#xff09;到实数集的函数。&#xff08;随机变量的值可以是离散的&#xff0c;也可以是连续的。 &#xff09; 事件可以定义为随机变量取特定值的集合。 2、离散型随机变量 随机变…

npm-run-all 使用实践

参考: npm-run-all 背景 在前端开发中&#xff0c;你是否存在以下烦恼: 写 package.json 的 scripts 命令时&#xff0c;命令太过冗长&#xff0c;例如编译命令 build 需要执行清理 clean, 编译css build:css, 编译js build:js, 编译html build:html 命令&#xff0c;则 bui…

OpenCV高级图形用户界面(17)设置一个已经创建的滚动条的最小值函数setTrackbarMin()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::setTrackbarMin 这个函数的作用就是设置指定窗口中轨迹条的最小位置。这使得开发者能够在程序运行时动态地调整轨迹条的范围&#xff0c;而不…

Leetcode—1242. 多线程网页爬虫【中等】Plus(多线程)

2024每日刷题&#xff08;187&#xff09; Leetcode—1242. 多线程网页爬虫 实现代码 /*** // This is the HtmlParsers API interface.* // You should not implement it, or speculate about its implementation* class HtmlParser {* public:* vector<string>…

Go程序的一生——Go如何跑起来的?

引入编译链接概述 编译过程 词法分析语法分析语义分析中间代码生成目标代码生成与优化链接过程Go 程序启动GoRoot 和 GoPathGo 命令详解 go buildgo installgo run总结参考资料 引入 我们从一个 Hello World 的例子开始&#xff1a; package mainimport "fmt"func…

PROFINET开发EtherNet/IP开发Vline板卡在称重设备行业的应用

本次分享的&#xff0c;是我们VlinePROFINET开发EtherNet/IP开发嵌入式板卡在称重行业的典型应用。 应用背景 在现代科技高度发达的时代&#xff0c;无论是科学研究、医疗诊断、制药生产还是工业制造&#xff0c;准确的测量和称重都是保证质量和效率的关键。 随着新项目实施…

【BGA布局布线-熬夜加班整理】

BGA CHIP PLACEMENT AND ROUTING RULE BGA 是 PCB 上常用的组件&#xff0c;通常 CPU、NORTH BRIDGE、SOUTH BRIDGE、 AGP CHIP、CARD BUS CHIP…等&#xff0c;大多是以 bga 的型式包装&#xff0c;简言之&#xff0c;80&#xfe6a;的 高频信号及特殊信号将会由这类型的 pac…

自动化测试与敏捷开发的重要性

敏捷开发与自动化测试是现代软件开发中两个至关重要的实践&#xff0c;它们相互补充&#xff0c;共同促进了软件质量和开发效率的提升。 敏捷开发的重要性 敏捷开发是一种以人为核心、迭代、循序渐进的软件开发方法。它强调以下几个核心价值观和原则&#xff1a; 个体和交互…

服务器技术研究分析:存储从HBM到CXL

服务器变革&#xff1a;存储从HBM到CXL 在《从云到端&#xff0c;AI产业的新范式&#xff08;2024&#xff09;》中揭示&#xff0c;传统服务器价格低至1万美金&#xff0c;而配备8张H100算力卡的DGX H100AI服务器价值高达40万美金&#xff08;约300万人民币&#xff09;。 从供…

jmeter使用文档

文章目录 一、安装使用1、下载2、bin/jmeter.properties介绍 二、windows使用1、微调&#xff08;1&#xff09;界面样式&#xff08;2&#xff09;修改语言 2、简单使用3、各组件详解&#xff08;1&#xff09;CSV 数据文件配置&#xff08;2&#xff09;BeanShell取样器 三、…

Golang | Leetcode Golang题解之第478题在圆内随机生成点

题目&#xff1a; 题解&#xff1a; type Solution struct {radius, xCenter, yCenter float64 }func Constructor(radius, xCenter, yCenter float64) Solution {return Solution{radius, xCenter, yCenter} }func (s *Solution) RandPoint() []float64 {r : math.Sqrt(rand.…