题目传送门

切蛋糕

题目描述

Facer今天买了n块蛋糕,不料被信息组中球球等好吃懒做的家伙发现了,没办法,只好浪费一点来填他们的嘴巴。他答应给每个人留一口,然后量了量每个人口的大小。Facer有把刀,可以切蛋糕,但他不能把两块蛋糕拼起来,但是他又不会给任何人两块蛋糕。现在问你,facer怎样切蛋糕,才能满足最多的人。(facer的刀很强,切的时候不会浪费蛋糕)。

输入输出格式

输入格式:

第一行n,facer有n个蛋糕。接下来n行,每行表示一个蛋糕的大小。再一行一个数m,为信息组的人数,然后m行,每行一个数,为一个人嘴的大小。(1<=n<=50, 1<=m<=1024)

输出格式:

一行,facer最多可以填多少张嘴巴。

输入输出样例

输入样例#1:

  1. 4
  2. 30
  3. 40
  4. 50
  5. 25
  6. 10
  7. 15
  8. 16
  9. 17
  10. 18
  11. 19
  12. 20
  13. 21
  14. 25
  15. 24
  16. 30
输出样例#1:

  1. 7

  分析:

  一道极其恶心的搜索题。

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

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

  Code:

  1. //It is made by HolseLee on 7th Aug 2018
  2. //Luogu.org P1528
  3. #include<cstdio>
  4. #include<cstdlib>
  5. #include<cstring>
  6. #include<cmath>
  7. #include<iostream>
  8. #include<iomanip>
  9. #include<algorithm>
  10. using namespace std;
  11.  
  12. const int N=;
  13. const int M=;
  14. int n,m,tot,waste,mou[M],all[M],c[N],t[N],ans,l,r,mid;
  15.  
  16. inline int read()
  17. {
  18. char ch=getchar();int num=;bool flag=false;
  19. while(ch<''||ch>''){if(ch=='-')flag=true;ch=getchar();}
  20. while(ch>=''&&ch<=''){num=num*+ch-'';ch=getchar();}
  21. return flag?-num:num;
  22. }
  23.  
  24. inline bool dfs(int num,int sta)
  25. {
  26. if(!num)return ;
  27. if(tot-waste<all[mid])return ;
  28. for(int i=sta;i<=n;++i)
  29. if(t[i]>=mou[num]){
  30. t[i]-=mou[num];
  31. if(t[i]<mou[])waste+=t[i];
  32. if(mou[num]==mou[num-]){
  33. if(dfs(num-,i))return ;}
  34. else {
  35. if(dfs(num-,))return ;}
  36. if(t[i]<mou[])waste-=t[i];
  37. t[i]+=mou[num];
  38. }
  39. return ;
  40. }
  41.  
  42. int main()
  43. {
  44. n=read();
  45. for(int i=;i<=n;++i){
  46. c[i]=read();
  47. tot+=c[i];
  48. }
  49. m=read();
  50. for(int i=;i<=m;++i)mou[i]=read();
  51. sort(mou+,mou+m+);
  52. while(mou[m]>tot)m--;
  53. for(int i=;i<=m;++i)
  54. all[i]=all[i-]+mou[i];
  55. l=,r=m;
  56. while(l<=r){
  57. waste=;
  58. mid=(l+r)>>;
  59. for(int i=;i<=n;++i)t[i]=c[i];
  60. if(dfs(mid,))l=mid+,ans=mid;
  61. else r=mid-;
  62. }
  63. printf("%d\n",ans);
  64. return ;
  65. }

洛谷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. OpenCV---分水岭算法

    推文: OpenCV学习(7) 分水岭算法(1)(原理简介简单明了) OpenCV-Python教程:31.分水岭算法对图像进行分割(步骤讲解不错) 使用分水岭算法进行图像分割 (一)获取灰度图像,二 ...

  2. MySql 插入数据库报错 Incorrect string value: '\xF0\xA0\x86\xA2'

    今天从nginx日志分析搜索关键字,然后把关键字插入到Mysql数据库里,出现如下错误 SQL state [HY000]; error code [1366]; Incorrect string v ...

  3. 洛谷P1124 文件压缩

    https://www.luogu.org/problem/show?pid=1124 题目背景 提高文件的压缩率一直是人们追求的目标.近几年有人提出了这样一种算法,它虽然只是单纯地对文件进行重排,本 ...

  4. Javascript判断Chrome浏览器

    今天分享一下如何通过Javascript来判断Chrome浏览器,这里是通过userAgent判断的,检测一下userAgent返回的字符串里面是否包含“Chrome”, 具体怎么检测是通过index ...

  5. 持续集成工具Jenkins安装、部署、使用

    本文介绍jenkins,利用其做项目发布与持续集成交付工具. 一.Jenkins是什么? Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括: 1.持续的软件版本发布 ...

  6. HDU 5995 Kblack loves flag (模拟)

    题目链接 Problem Description Kblack loves flags, so he has infinite flags in his pocket. One day, Kblack ...

  7. HDU 2067 小兔的棋盘 (模拟)

    题目链接 Problem Description 小兔的叔叔从外面旅游回来给她带来了一个礼物,小兔高兴地跑回自己的房间,拆开一看是一个棋盘,小兔有所失望.不过没过几天发现了棋盘的好玩之处.从起点(0, ...

  8. 莫比乌斯反演第二弹 入门 Coprime Integers Gym - 101982B

    题目链接:https://cn.vjudge.net/problem/Gym-101982B 题目大意: 给你(a,b)和(c,d)这两个区间,然后问你这两个区间中互素的对数是多少. 具体思路:和我上 ...

  9. flask插件系列之flask_caching缓存

    前言 为了尽量减少缓存穿透,同时减少web的响应时间,我们可以针对那些需要一定时间才能获取结果的函数和那些不需要频繁更新的视图函数提供缓存服务,可以在一定的时间内直接返回结果而不是每次都需要计算或者从 ...

  10. python之自然语言处理入门(一)

    前言 NTLK是著名的Python自然语言处理工具包,记录一下学习NTLK的总结. 安装nltk pip install nltk # 测试 import nltk 安装相关的包 import nlt ...