题目传送门

切蛋糕

题目描述

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

  分析:

  一道极其恶心的搜索题。

  首先我们不难想到,一块蛋糕可以给一个嘴大的人或者给几个嘴小的人,那显然是给嘴小的人能得到局部最优。但是局部最优并不一定能得到全局最优,所以我们要搜索啊(废话。。。先对所有人按嘴的大小排序,如果蛋糕总和也不能满足嘴最大的人,那么就可以直接把他踢出去了(23333,然后二分能满足的人数,深搜检验即可。

  当然这样做复杂度肯定还是承受不了,还需要剪枝。因为有的蛋糕在给一些人吃了之后还有剩余,但是如果剩余部分连嘴最小的人也满足不了那就只能丢弃,我们就可以在dfs的时候记录一个waste值,表示不能在利用的蛋糕的大小,如果蛋糕总体积减去waste值小于剩余人数的需求值,就可以直接退出。加上这个优化以后复杂度就非常优秀了。

  Code:

//It is made by HolseLee on 7th Aug 2018
//Luogu.org P1528
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<iomanip>
#include<algorithm>
using namespace std; const int N=;
const int M=;
int n,m,tot,waste,mou[M],all[M],c[N],t[N],ans,l,r,mid; inline int read()
{
char ch=getchar();int num=;bool flag=false;
while(ch<''||ch>''){if(ch=='-')flag=true;ch=getchar();}
while(ch>=''&&ch<=''){num=num*+ch-'';ch=getchar();}
return flag?-num:num;
} inline bool dfs(int num,int sta)
{
if(!num)return ;
if(tot-waste<all[mid])return ;
for(int i=sta;i<=n;++i)
if(t[i]>=mou[num]){
t[i]-=mou[num];
if(t[i]<mou[])waste+=t[i];
if(mou[num]==mou[num-]){
if(dfs(num-,i))return ;}
else {
if(dfs(num-,))return ;}
if(t[i]<mou[])waste-=t[i];
t[i]+=mou[num];
}
return ;
} int main()
{
n=read();
for(int i=;i<=n;++i){
c[i]=read();
tot+=c[i];
}
m=read();
for(int i=;i<=m;++i)mou[i]=read();
sort(mou+,mou+m+);
while(mou[m]>tot)m--;
for(int i=;i<=m;++i)
all[i]=all[i-]+mou[i];
l=,r=m;
while(l<=r){
waste=;
mid=(l+r)>>;
for(int i=;i<=n;++i)t[i]=c[i];
if(dfs(mid,))l=mid+,ans=mid;
else r=mid-;
}
printf("%d\n",ans);
return ;
}

洛谷P1528 切蛋糕 [搜索,二分答案]的更多相关文章

  1. [洛谷P1528] 切蛋糕

    洛谷题目链接:切蛋糕 题目描述 Facer今天买了n块蛋糕,不料被信息组中球球等好吃懒做的家伙发现了,没办法,只好浪费一点来填他们的嘴巴.他答应给每个人留一口,然后量了量每个人口的大小.Facer有把 ...

  2. 【算法•日更•第六期】头脑风暴:洛谷P1528 切蛋糕题解

    ▎(一个没有用处的)前言 为什么这次题解特意写明题号呢?因为我发现了这样的事情: 所以不要混了,想看P1714题解的同志们可以圆润的滚开了. 好了,不说没用的了,切入正题: ▎题目 题目及测评链接:戳 ...

  3. 洛谷 P1577 切绳子【二分答案】

    题目描述 有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的 绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位. 输入输出格式 输入格式: 第一行两个整数N和K,接下来N行,描 ...

  4. [CodePlus 2017 11月赛&洛谷P4058]木材 题解(二分答案)

    [CodePlus 2017 11月赛&洛谷P4058]木材 Description 有 n棵树,初始时每棵树的高度为 Hi ,第 i棵树每月都会长高 Ai.现在有个木料长度总量为 S的订单, ...

  5. 洛谷 P1714 切蛋糕 题解

    P1714 切蛋糕 题目描述 今天是小Z的生日,同学们为他带来了一块蛋糕.这块蛋糕是一个长方体,被用不同色彩分成了N个相同的小块,每小块都有对应的幸运值. 小Z作为寿星,自然希望吃到的第一块蛋糕的幸运 ...

  6. 洛谷P4589 [TJOI2018]智力竞赛(二分答案 二分图匹配)

    题意 题目链接 给出一个带权有向图,选出n + 1n+1条链,问能否全部点覆盖,如果不能,问不能覆盖的点权最小值最大是多少 Sol TJOI怎么净出板子题 二分答案之后直接二分图匹配check一下. ...

  7. 洛谷 P1824 进击的奶牛 【二分答案】(求最大的最小值)

    题目链接:https://www.luogu.org/problemnew/show/P1824 题目描述 Farmer John建造了一个有N(2<=N<=100,000)个隔间的牛棚, ...

  8. 洛谷P3964 [TJOI2013]松鼠聚会 [二分答案,前缀和,切比雪夫距离]

    题目传送门 松鼠聚会 题目描述 草原上住着一群小松鼠,每个小松鼠都有一个家.时间长了,大家觉得应该聚一聚.但是草原非常大,松鼠们都很头疼应该在谁家聚会才最合理. 每个小松鼠的家可以用一个点x,y表示, ...

  9. 洛谷P3576 [POI2014]MRO-Ant colony [二分答案,树形DP]

    题目传送门 MRO-Ant colony 题目描述 The ants are scavenging an abandoned ant hill in search of food. The ant h ...

随机推荐

  1. Codeforces 221 A. Little Elephant and Function

    A. Little Elephant and Function time limit per test 2 seconds memory limit per test 256 megabytes in ...

  2. Python学习笔记(十八)@property

    # 请利用@property给一个Screen对象加上width和height属性, # 以及一个只读属性resolution: # -*- coding: utf-8 -*- class Scree ...

  3. Linux 中的变量

    echo  $PATH var =a echo $var export  var1=11 echo $var 访问关系: whereis yum  file /usr/bin/yum vi  /usr ...

  4. linux平台 PHP 实现 word转pdf的艰难历程...

    1.网上搜索资料 无非是 openoffice + PHP的com组件 然而试了很多次 都不可靠 2.后来找到 openoffice + jodconverter(需java环境) 一.安装openo ...

  5. 基于canvas的图片编辑合成器

    在我们日常的前端开发中,经常会要给服务器上传图片,但是局限很大,图片只能是已有的,假设我想把多张图片合成一张上传就需要借助图片编辑器了,但是现在我们有了canvas合成就简单多了 首先我们看图片编辑器 ...

  6. spring boot 加载原理

    spring boot quick start 在springBoot里面,很吸引的一个特征就是可以直接把应用打包成jar/war包形式.然后jar/war包可以直接运行的.不需要再配置web Ser ...

  7. SVM支持向量机的基本原理

    SVM支持向量机的基本原理 对于很多分类问题,例如最简单的,一个平面上的两类不同的点,如何将它用一条直线分开?在平面上我们可能无法实现,但是如果通过某种映射,将这些点映射到其它空间(比如说球面上等), ...

  8. OGG生成数据定义文件的参数NOEXTATTR

    ./defgen paramfile ./dirprm/jzjj.prm NOEXTATTR In OGG 11.2, there is a new parameter NOEXTATTR. This ...

  9. centos 6.5配置ftp服务器,亲测可用

    设置开机启动 1 chkconfig vsftpd on 启动服务 1 /sbin/service vsftpd start 配置FTP用户组/用户以及相应权限 添加用户组 1 groupadd ft ...

  10. CentOS7.4 安装 oracle12c

    安装依赖 yum install -y binutils.x86_64 compat-libcap1.x86_64 gcc.x86_64 gcc-c++.x86_64 glibc.i686 glibc ...