bzoj1082: [SCOI2005]栅栏(二分答案搜索判断)
1082: [SCOI2005]栅栏
题目:传送门
题解:
是不是一开始在想DP?本蒟蒻也是qwq,结果很nice的错了ORZ
正解:二分+搜索
我们可以先把两种木材都进行排序,那么如果需要的最大木材比可提供的最大木材还要大的话,那么可以直接舍弃这种需要的木材。
然后就可以进入二分,如果当前可以做贡献的提供木材加起来都没有前mid块需要木材大的话,很明显当前mid不ok
返回判断值再记录答案就好了,注意一些小细节的优化
代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
typedef long long LL;
using namespace std;
bool flag;
int n,m,mid;
int a[],b[],bl[];
LL sa;
int sb[];
void dfs(int ak,int bk,int w)
{
if(bk==)flag=;
while(ak<=n && a[ak]<b[]){w+=a[ak];ak++;}//当前木材比最小的需求值还要小,跳下一个木材
if(flag || ak>n)return;//如果已经合法或者没有符合要求的木材了就退出(因为已经排序过了啊)
if(w+sb[mid]>sa)return;//如果有贡献的提供木材加起来都没有前mid块需要木材大,肯定不ok
int t=ak,t1=ak,t2=bk,t3=w;
if(b[bk]==b[bk+] && bk!=mid)t=bl[bk+];//小剪枝,如果我当前需要的木块和上一块一样,直接跳到上一次使用过的木材
for(int i=t;i<=n;i++)
if(a[i]>=b[bk])
{
bl[bk]=i;a[i]-=b[bk];
bk--;
dfs(ak,bk,w);
ak=t1;bk=t2;w=t3;a[i]+=b[t2];
}
}
int main()
{
scanf("%d",&n);for(int i=;i<=n;i++)scanf("%d",&a[i]);
scanf("%d",&m);for(int i=;i<=m;i++)scanf("%d",&b[i]);
sort(a+,a+n+);sort(b+,b+m+);
while(b[m]>a[n])m--;//如果需要的最大木材比可提供的最大木材还要大,舍弃,直接m--
int tot=;
for(int i=;i<=n;i++)if(a[i]>b[])a[++tot]=a[i];
n=tot;
for(int i=;i<=n;i++)sa+=a[i];
for(int i=;i<=m;i++)sb[i]=sb[i-]+b[i];
int l=,r=m,ans=;
while(l<=r)
{
mid=(l+r)/;
flag=;
dfs(,mid,);
if(flag!=)ans=mid,l=mid+;
else r=mid-;
}
printf("%d\n",ans);
return ;
}
bzoj1082: [SCOI2005]栅栏(二分答案搜索判断)的更多相关文章
- [BZOJ1082][SCOI2005]栅栏 二分+搜索减枝
1082: [SCOI2005]栅栏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2430 Solved: 1034[Submit][Status ...
- bzoj1082[SCOI2005]栅栏
Description 农夫约翰打算建立一个栅栏将他的牧场给围起来,因此他需要一些特定规格的木材.于是农夫约翰到木材店购 买木材.可是木材店老板说他这里只剩下少部分大规格的木板了.不过约翰可以购买这些 ...
- BZOJ1082: [SCOI2005]栅栏 题解
题目大意: 有一些木材,可以没有浪费地将一根木材分成几块木板(比如长度为10的木板可以切成长度为8和2的两块木板).现在你希望得到一些长度的木板,问通过分割木材最多能得到几块想要的木板. 思路: 首先 ...
- [SCOI2005]栅栏 二分+dfs
这个题真的是太nb了,各种骚 二分答案,肯定要减最小的mid个,从大往小搜每一个木板,从大往小枚举所用的木材 当当前木材比最短的木板还短,就扔到垃圾堆里,并记录waste,当 waste+sum> ...
- [luogu2329 SCOI2005] 栅栏(二分+搜索)
传送门 Solution 纯搜索80分,加二分90分,再补一个小剪枝满分qwq 真.小剪枝:如果下一个的需求和当前相同,那么不需要再次从头开始试(看代码就明白了233) Code #include & ...
- 【BZOJ 1082】[SCOI2005]栅栏 二分+dfs
对于最优解我们发现所有的最优解都可以是前多少多少个,那么我们就二分这个前多少多少个,然后用dfs去判解,我们发现在dfs的过程中如果不剪枝几乎必T,所以我们就需要一些有效的剪枝 I. 我们在枚举过程中 ...
- CF 371C-Hamburgers[二分答案]
C. Hamburgers time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- 字符串hash + 二分答案 - 求最长公共子串 --- poj 2774
Long Long Message Problem's Link:http://poj.org/problem?id=2774 Mean: 求两个字符串的最长公共子串的长度. analyse: 前面在 ...
- 【二分答案】 【POJ3497】 【Northwestern Europe 2007】 Assemble 组装电脑
Assemble Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3171 Accepted: 1013 Descript ...
随机推荐
- Registry Connect failed,Windows服务诊断
Message:Connection failed for 192.168.32.38_e-futrueserer. Details:Windows Registry Datasource: Regi ...
- 0x16 Trie
这章刷的真带劲 嘿嘿 裸题 #include<cstdio> #include<iostream> #include<cstring> #include<cs ...
- kentico7中设置网站的主页
打开SiteManager,选择Settings,然后左上角选择具体的网站,Content,Web Site Content,Default alias path
- JQuery 登录窗口的布局
<!-- Button trigger modal --><button type="button" class="btn btn-primary bt ...
- 树莓派搭建 Google TV
出处:http://my.oschina.net/funnky/blog/142067 树莓派搭建 Google TV 目录:[ - ] Google TV是啥玩意 ? 搭建我们自己的Google T ...
- BZOJ 2402 陶陶的难题II (01分数规划+树剖+线段树+凸包+二分)
题目大意:略 一定范围内求最大值,考虑二分答案 设现在选择的答案是$mid$,$max \left \{ \frac{yi+qj}{xi+pj} \right \} \geq mid $ 展开可得,$ ...
- [luogu3369] 普通平衡树(splay模板)
题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1.插入 xx 数 2.删除 xx 数(若有多个相同的数,因只删除一个) 3.查询 xx 数的排名(排名定义为比 ...
- Rsync和Sersync(企业实时同步方案)
注:本文章依据参考文章中的信息资料结合自己的实践操作而成 一.实验环境介绍 系统版本:Cent OS 7.4 X64 内核版本:3.10.0-693.5.2.el7.x86_64 系统采用最小化安装, ...
- Vue.js 笔记之 img src
固定路径(原始html) index.html如下,其中,引号""里面就是图片的路径地址 ```<img src="./assets/1.png"> ...
- 2019-03-14 Python爬虫问题 爬取网页的汉字打印出来乱码
html = requests.get(YieldCurveUrl, headers=headers) html=html.content.decode('UTF-8') # print(html) ...