[洛谷P1528] 切蛋糕
洛谷题目链接:切蛋糕
题目描述
Facer今天买了n块蛋糕,不料被信息组中球球等好吃懒做的家伙发现了,没办法,只好浪费一点来填他们的嘴巴。他答应给每个人留一口,然后量了量每个人口的大小。Facer有把刀,可以切蛋糕,但他不能把两块蛋糕拼起来,但是他又不会给任何人两块蛋糕。现在问你,facer怎样切蛋糕,才能满足最多的人。(facer的刀很强,切的时候不会浪费蛋糕)。
输入输出格式
输入格式:
第一行n,facer有n个蛋糕。接下来n行,每行表示一个蛋糕的大小。再一行一个数m,为信息组的人数,然后m行,每行一个数,为一个人嘴的大小。(1<=n<=50, 1<=m<=1024)
输出格式:
一行,facer最多可以填多少张嘴巴。
输入输出样例
输入样例#1:
4
30
40
50
25
10
15
16
17
18
19
20
21
25
24
30
输出样例#1:
7
简述一下题意:给出\(n\)块蛋糕的大小和\(m\)个人要吃的量.现在只允许切蛋糕,求最多能满足多少人的需求.
我们并不知道最终能满足多少人,但是很显然,肯定要优先满足需求较小的人.所以可以现将每个人的需求排个序,这样口的大小的数组就是单调的了.既然是单调的,就可以用二分来确定最多能否满足前mid个人.前mid个人能否满足直接爆搜就可以了.
然而,这样并过不了,因为数据范围,这么搞是肯定要TLE的.所以我们可以考虑一下剪枝.
- 因为口的大小是单调的,所以如果第\(i\)个人和第\(i-1\)个人的口大小相同,不能满足第\(i\)个人就不能满足第\(i-1\)个人.
- 因为每次切都会有浪费(搜索过程中并不知道哪些一定可以作为浪费,但是如果第一个人都无法满足就一定是浪费了的),所以可以吧浪费的统计下来,那么如果蛋糕的总和减去浪费的总量小于前\(mid\)个人的口的大小,则不论怎么搜,都搜不出结果.
- 然后就是在搜索的过程中可以先从第\(mid\)个开始往第一个搜,因为能满足第\(mid\)人的情况比较少,可以减少分支.
#include<bits/stdc++.h>
using namespace std;
const int N=50+5;
const int M=1024+5;
int n, m, ans = 0, waste = 0;
int cake[N], temp[N], sum = 0;
int mouth[M], pre[M];
bool dfs(int person,int pos,int mid){
if(person == 0) return true;
if(sum-waste < pre[mid]) return false;
for(int i=pos;i<=n;i++){
if(temp[i] < mouth[person]) continue;
temp[i] -= mouth[person];
if(temp[i] < mouth[1]) waste += temp[i];
if(mouth[person] == mouth[person-1]){
if(dfs(person-1,i,mid)) return true;
}
else if(dfs(person-1,1,mid)) return true;
if(temp[i] < mouth[1]) waste -= temp[i];
temp[i] += mouth[person];
}
return false;
}
bool check(int mid){
memcpy(temp,cake,sizeof(temp));
waste = 0; bool res = dfs(mid,1,mid);
if(res) return true;
return false;
}
int main(){
//freopen("data.in","r",stdin);
cin >> n;
for(int i=1;i<=n;i++) cin >> cake[i], sum += cake[i];
cin >> m;
for(int i=1;i<=m;i++) cin >> mouth[i];
sort(mouth+1 , mouth+m+1); sort(cake+1 , cake+n+1);
for(int i=1;i<=m;i++) pre[i] = pre[i-1]+mouth[i];
int l = 0, r = m, mid;
while(pre[r] > sum) r--;
while(l <= r){
mid = (l+r>>1);
if(check(mid)) l = mid+1, ans = mid;
else r = mid-1;
}
printf("%d\n",ans);
return 0;
}
[洛谷P1528] 切蛋糕的更多相关文章
- 洛谷P1528 切蛋糕 [搜索,二分答案]
题目传送门 切蛋糕 题目描述 Facer今天买了n块蛋糕,不料被信息组中球球等好吃懒做的家伙发现了,没办法,只好浪费一点来填他们的嘴巴.他答应给每个人留一口,然后量了量每个人口的大小.Facer有把刀 ...
- 【算法•日更•第六期】头脑风暴:洛谷P1528 切蛋糕题解
▎(一个没有用处的)前言 为什么这次题解特意写明题号呢?因为我发现了这样的事情: 所以不要混了,想看P1714题解的同志们可以圆润的滚开了. 好了,不说没用的了,切入正题: ▎题目 题目及测评链接:戳 ...
- 洛谷 P1714 切蛋糕 题解
P1714 切蛋糕 题目描述 今天是小Z的生日,同学们为他带来了一块蛋糕.这块蛋糕是一个长方体,被用不同色彩分成了N个相同的小块,每小块都有对应的幸运值. 小Z作为寿星,自然希望吃到的第一块蛋糕的幸运 ...
- 洛谷 P1714 切蛋糕 单调队列
这个题比较显然,要用前缀和来做.但只用前缀和是过不去的,会TLE,所以需要进行优化. 对于每个前缀和数组 b 中的元素,都可以找到以 b[i] 结尾的子段最大值 p[i],显然,最终的 ans 就是 ...
- 洛谷—— P1714 切蛋糕
https://www.luogu.org/problem/show?pid=1714 题目描述 今天是小Z的生日,同学们为他带来了一块蛋糕.这块蛋糕是一个长方体,被用不同色彩分成了N个相同的小块,每 ...
- [洛谷P1714]切蛋糕
题目大意:给你n个整数,求出其中长度不超过m的最大字段和. 题解:单调队列维护前缀和最小值,然后用当前值减去当前有效最小值即可 C++ Code: #include<cstdio> usi ...
- 洛谷P1714切蛋糕
题目 该题目就是求这n个数的前缀和所组成的数组的所有子区间的左端点和右端点相差不超过m,且他们的前缀和差最大,求出这个最大值即可. 而朴素算法肯定会T,而我们发现如果前缀和最大的话,则前缀和的值一定是 ...
- 洛谷P1714 切蛋糕(单调队列)
先放代码...... 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=5e5+10,M=0x3f3f3f3f; ...
- 洛谷P1577 切绳子题解
洛谷P1577 切绳子题解 题目描述 有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的 绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2为后的小数). 输入输出格 ...
随机推荐
- express操作数据库
Express 首页 入门 使用指南 API 中文手册 进阶话题 有用的资源 集成数据库 为 Express 应用添加连接数据库的能力,只需要加载相应数据库的 Node.js 驱动即可.这里将会简要介 ...
- windows下oracle 11g r2 安装过程与卸载详细图解
Oracle 11g安装 1.解压下载的包,然后进入包内,点击setup.exe开始安装 . 2.出现如下:一般把那个小对勾取消,点击下一步进行, 弹出下图这个后点‘是' 3.下图后,选择创建和配置数 ...
- 掘金 Android 文章精选合集
掘金 Android 文章精选合集 掘金官方 关注 2017.07.10 16:42* 字数 175276 阅读 50053评论 13喜欢 669 用两张图告诉你,为什么你的 App 会卡顿? - A ...
- MySQL数据库性能优化专题
摘录: 书:<MySQL性能调优与架构设计> 一个系列: (按顺序排一下) MySQL 数据库性能优化之缓存参数优化 http://isky000.com/database/mysql-p ...
- Android Open Source Projects(汇总与整理)
Android Open Source Projects 目前包括: Android开源项目第一篇——个性化控件(View)篇 包括ListView.ActionBar.Menu.ViewPager ...
- ubuntu 把软件源修改为国内源
国内有很多Ubuntu的镜像源,比如:阿里源.网易源等,还有很多教育网的源,比如:清华源.中科大源等. 这里以清华源为例讲解如何修改Ubuntu 18.04里面默认的源. 修改步骤 第一步:备份原始源 ...
- 第七篇数字&字符串之练习题
1.执行Python脚本的两种方式2.简述位.字节的关系3.简述ascii.unicode.utf-‐8.gbk的关系4.请写出“李杰”分别用utf-‐8和gbk编码所占的位数5.Pyhton单行 ...
- restAssured + TestNG测试接口,以下是一个get 请求。
package Elaine.Test.G.APITest; import org.testng.Assert;import org.testng.annotations.BeforeTest;imp ...
- redis的认识
<?php /* Redis优势: 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s . 丰富的数据类型 – Redis支持二进制案例的 String, Lis ...
- Week2 Teamework from Z.XML 软件分析与用户需求调查(五)从对比中看见必应助手发展空间
本文将主要探讨软件功能前景(浮动头像界面,升级式角色),找出与bing助手相类似功能的资深软件,分析这些软件的发展趋势和用户体验,从历史的角度来评测bing助手的某些功能的前景. 1.浮动头像界面-曲 ...