http://www.lydsy.com/JudgeOnline/problem.php?id=1082 (题目链接)

题意

  给出m块木柴,以及n块木板,要求将m块木柴做木板,要求将木柴切割成与木板一样的长度,问最多可以做成几块木板。

Solution

  今日考题。乍一看,好像可以二分,然而并不会check,于是码了个贪心,10分mdzz。。

  正解:二分+搜索。

  每次二分答案mid后,对每块木板进行搜索,枚举用那根木柴去进行切割。没想到剪枝这么强大,这都可以搜过去。。

  剪枝1:一开始将不符合条件的某些木柴与木板去掉。

  剪枝2:有些木柴经过切割后已经比最短的木板更短,将剩下的长度加到一个变量Waste中,判断是否  Waste + mid块木板总长度>木柴总长度。

  剪枝3:若某块木板在之前已经搜索过了,直接从当时被切割的木柴处进行搜索。

代码

// bzoj1082
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define LL long long
#define inf 2147483640
#define MOD 1000000009
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; const int maxn=10010;
int a[maxn],b[maxn],S,sum[maxn],bl[maxn];
int n,m,flag,mid; void dfs(int x,int p,int w) {
if (x==0) {flag=1;return;}
while (p<=n && a[p]<b[1]) {w+=a[p];p++;}
if (w+sum[mid]>S || flag || p>n) return;
int t=p;
if (b[x]==b[x+1] && x!=mid) t=bl[x+1];
for (int i=t;i<=n;i++) if (a[i]>=b[x]) {
bl[x]=i;
a[i]-=b[x];dfs(x-1,p,w);
a[i]+=b[x];
if (flag) return;
}
}
int main() {
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
scanf("%d",&m);
for (int i=1;i<=m;i++) scanf("%d",&b[i]);
sort(a+1,a+1+n);
sort(b+1,b+1+m);
while (b[m]>a[n]) m--;
int tot=0;
for (int i=1;i<=n;i++) if (a[i]>b[1]) a[++tot]=a[i];
n=tot;S=0;sum[0]=0;
for (int i=1;i<=n;i++) S+=a[i];
for (int i=1;i<=m;i++) sum[i]=sum[i-1]+b[i];
int L=1,R=m,ans=0;
while (L<=R) {
mid=(L+R)>>1;
flag=0;dfs(mid,1,0);
if (flag) ans=mid,L=mid+1;
else R=mid-1;
}
printf("%d\n",ans);
return 0;
}

  

最新文章

  1. runtime
  2. C#中ToString格式大全
  3. Sqlserver 自定义表类型定义,使用,删除
  4. annotation-config 和 component-scan 的区别
  5. iframe自适应方法
  6. 基础学习day11--多线程一线程的创建,运行,同步和锁
  7. linux文件系统模拟
  8. Ubuntu安装软件提示”需要安装不能信任的软件包”解决办法
  9. css自定义字体完美解决方案example
  10. 条形码Code128源代码
  11. jQuery阻止冒泡和HTML默认操作
  12. javascript组件的基本结构
  13. Kotlin尝试之一:写代码前的准备
  14. UX2 beta 3正式发布!!
  15. Intellij idea史上最简单的教程之Linux下安装与破解Intellij idea2017
  16. 一个超级简单的demo带你走进redux的大坑
  17. js&#183;逻辑运算
  18. 查出了a表,然后对a表进行自查询,a表的别名t1,t2如同两张表,因为t1,t2查询的条件不一样,真的如同两张表,关联两张表,可以将两行或者多行数据合并成一行,不必使用wm_concat()函数。为了将t2表的数据全部查出来使用了右连接。
  19. JQuery插件之【jqGrid】常用语法整理
  20. linux 之sed

热门文章

  1. HDU 1166 敌兵布阵
  2. 分布式消息系统:Kafka
  3. Wabpack系列:在webpack+vue开发环境中使用echarts导致编译文件过大怎么办?
  4. 20145230GDB调试汇编堆栈过程分析
  5. c++基础 explicit
  6. 东大OJ-1588: Routing Table
  7. PHP与MySQL
  8. isinstance
  9. 使用 Spring 3 来创建 RESTful Web Services
  10. dblink连接的目标端 session不断的问题。