链接

思路

  二分+搜索+剪枝。

  首先二分一个答案,表示最多可以切出x块。(一个结论:切出的一定是从较小的前x块。如果一个木材可以满足很多个需要的木材,那么切出最小的,就意味着以后再选时的机会更多。)

  然后暴力搜索前x块分别由哪个木材切出。

  剪枝1:如果所有提供的木材加起来也不能满足需要的木材,直接跳过

  剪枝2:记录一下浪费掉的木材(即一块木材切掉了一些后,剩下的木材中连最小的也切不出了的),如果提供的木材总量-浪费掉<当前所有的木材需要的,直接跳过。

  剪枝3:当前需要的和下一块需要的木材是一样长的,那么不必从第一块开始搜索了,直接从上次搜索到的地方开始。

代码:

 #include<cstdio>
#include<algorithm>
#include<iostream> using namespace std; const int N = ;
int n,m,rest,tot;
int a[N],b[N],c[N],sum[N]; inline int read() {
int x = ,f = ;char ch = getchar();
for (; !isdigit(ch); ch=getchar()) if(ch=='-') f=-;
for (; isdigit(ch); ch=getchar()) x=x*+ch-'';
return x * f;
}
bool dfs(int now,int s) { // 当前需要的木材,从给出的木材中第s个开始
if (!now) return true;
if (rest+sum[now] > tot) return false; // 剪枝2
for (int i=s; i<=m; ++i) { // 枚举所有给出的木材
if (c[i] >= b[now]) { // 当前木材可以切出需要的
c[i] -= b[now]; //-
if (c[i] < b[]) rest += c[i];
if (b[now]==b[now-]) {
if (dfs(now-,i)) return true;
}
else {if (dfs(now-,)) return true;} // 剪枝3
if (c[i] < b[]) rest -= c[i];
c[i] += b[now]; // -
}
}
return false;
}
bool check(int x) {
for (int i=; i<=m; ++i) c[i] = a[i];
rest = ;
return dfs(x,);
}
int main() {
m = read();
for (int i=; i<=m; ++i) a[i] = read(),tot += a[i];
sort(a+,a+m+);
n = read();
for (int i=; i<=n; ++i) b[i] = read();
sort(b+,b+n+);
for (int i=; i<=n; ++i) sum[i] = sum[i-] + b[i]; while (sum[n] > tot) n--; // 剪枝1
int L = ,R = n,ans; // L有等于0的情况!
while (L <= R) {
int mid = (L + R) / ;
if (check(mid)) L = mid + ,ans = mid;
else R = mid - ;
}
cout << ans <<'\n';
return ;
}

1082: [SCOI2005]栅栏的更多相关文章

  1. bzoj 1082: [SCOI2005]栅栏 题解

    1082: [SCOI2005]栅栏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2340  Solved: 991[Submit][Status] ...

  2. 【BZOJ】1082: [SCOI2005]栅栏(二分+dfs)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1082 题意:n个给出木板,m个给出木板.可以将那m个木板锯成泥想要的长度.问最大能锯成多少个给出的n ...

  3. [BZOJ 1082] [SCOI2005] 栅栏 【二分 + DFS验证(有效剪枝)】

    题目链接:BZOJ - 1082 题目分析 二分 + DFS验证. 二分到一个 mid ,验证能否选 mid 个根木棍,显然要选最小的 mid 根. 使用 DFS 验证,因为贪心地想一下,要尽量先用提 ...

  4. bzoj 1082: [SCOI2005]栅栏

    Description 农夫约翰打算建立一个栅栏将他的牧场给围起来,因此他需要一些特定规格的木材.于是农夫约翰到木材店购 买木材.可是木材店老板说他这里只剩下少部分大规格的木板了.不过约翰可以购买这些 ...

  5. bzoj 1082: [SCOI2005]栅栏【二分+dfs】

    二分答案,dfs判断是否可行,当b[k]==b[k-1]时可以剪枝也就是后移枚举位置 #include<iostream> #include<cstdio> #include& ...

  6. [BZOJ1082][SCOI2005]栅栏 二分+搜索减枝

    1082: [SCOI2005]栅栏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2430  Solved: 1034[Submit][Status ...

  7. bzoj1082: [SCOI2005]栅栏(二分答案搜索判断)

    1082: [SCOI2005]栅栏 题目:传送门 题解: 是不是一开始在想DP?本蒟蒻也是qwq,结果很nice的错了ORZ 正解:二分+搜索 我们可以先把两种木材都进行排序,那么如果需要的最大木材 ...

  8. 【BZOJ1082】[SCOI2005]栅栏(搜索)

    [BZOJ1082][SCOI2005]栅栏(搜索) 题面 BZOJ 洛谷 题解 随便写个爆搜,洛谷上就\(80\)分了.先放爆搜代码: #include<iostream> #inclu ...

  9. 洛谷 P2329 [SCOI2005]栅栏 解题报告

    P2329 [SCOI2005]栅栏 题目描述 农夫约翰打算建立一个栅栏将他的牧场给围起来,因此他需要一些特定规格的木材.于是农夫约翰到木材店购买木材.可是木材店老板说他这里只剩下少部分大规格的木板了 ...

随机推荐

  1. Bonita portal 源码编译(未完成)

    首先下载源代码 https://github.com/bonitasoft/bonita-portal-js 以下内容为Github 的安装教程包含我安装过程中遇到的问题.并加以修正 Bonita p ...

  2. SQL:获取语句执行时间2

    获取sql执行时间方法2 --清除缓存 CHECKPOINT; DBCC DROPCLEANBUFFERS; DBCC FREEPROCCACHE; DBCC FREESYSTEMCACHE ('AL ...

  3. IOS ScrollView的使用 and delegate

    ScrollView常用的属性设置 //设置内容尺寸 // CGFloat contentH=self.lastBtn.frame // .origin.y+self.lastBtn.frame.si ...

  4. Android(java)学习笔记62:android.intent.action.MAIN 与 android.intent.category.LAUNCHER 理解

    1. 先看看网路上的说法: android.intent.action.MAIN 决定应用程序最先启动的 Activity android.intent.category.LAUNCHER 决定应用程 ...

  5. url网址解析的好帮手

    接下来进入node的重点,也就是介绍nodejs主要api的功能和如果使用,由于nodejs逐渐能满足这种高并发和大规模的场景.他才被更多的公司所采用 无论什么资源,一定要有明确的地址才有意义,在互联 ...

  6. win10自带应用图标显示感叹号无法打开如何解决(详细版)

    现象 今天打开电脑图片时发现系统自带的大多应用都无法运行,这些应用图标上都显示着一个感叹号, 应用图标上的颜色被覆上了一层黑色点击后无法运行,自带的应用商店也无法打开,想重装软件都不行这是怎么回事呢? ...

  7. removing vmware debugger from visual studio

    removing vmware debugger from visual studio by Ross on 十月 14, 2010 at 5:30 下午 under Visual Studio |  ...

  8. list 用法的随手记

    在list 用法中.1. add是直接添加 一个变量.不能添加一个 集合元素,比如数组 这种写法是错误的 ,因为不能添加集合 这种写法是对的,因为直接添加元素 2. 但是addrannge 是添加一个 ...

  9. C#声明方法

    一.声明方法 方法是类中用于执行计算或其它行为的成员. 方法可以分为: ?静态方法:可以通过类进行访问.?实例方法:可以通过类的对象进行访问. 1. C#方法的声明 声明方法的语法格式如下: 访问修饰 ...

  10. Python学习之路——基础1

    python作为一门解释型的编程语言,和c/c++等其他语言都或多或少有相通的地方,所以有语言基础的话,学起来还是方便一些.所以我的笔记对于相对简单的概念可能会选择放过,但对自己记录的东西我会力求完备 ...