P2329 [SCOI2005]栅栏

题目描述

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

而且约翰有一把神奇的锯子,用它来锯木板,不会产生任何损失,也就是说长度为10的木板可以切成长度为8和2的两个木板。

你的任务:给你约翰所需要的木板的规格,还有木材店老板能够给出的木材的规格,求约翰最多能够得到多少他所需要的木板。

输入输出格式

输入格式:

第一行为整数\(m(m<= 50)\)表示木材店老板可以提供多少块木材给约翰。紧跟着m行为老板提供的每一块木板的长度。

接下来一行(即第\(m+2\)行)为整数\(n(n <= 1000)\),表示约翰需要多少木材。

接下来\(n\)行表示他所需要的每一块木板的长度。木材的规格小于\(32767\)。(对于店老板提供的和约翰需要的每块木板,你只能使用一次)。

输出格式:

只有一行,为约翰最多能够得到的符合条件的木板的个数。


比较正常的搜索剪枝题目。

首先我们想对某个东西排个序剪枝一下,因为在搜索中木材的长度是动态的,所以对它排序没得用。

对木板排的话又不能确定上界。

自然的想到二分搞一个上界。

然后我们对木板排序,从大往小放。

剪枝1:当当前木板和下一块等长,下次从同一块木材搜索

剪枝2:找到当前所有还可能贡献答案(剩余长度大于最小的木板)的木材,然后计算是否大于剩下的木板


Code:

#include <cstdio>
#include <algorithm>
int n,m_,m,stick[52],f[1002],need[1002],mi=1<<30;
int dfs(int dep,int s)
{
if(!dep) return 1;
int mx=0,sum=0;
for(int i=1;i<=m;i++)
if(stick[i]>=need[1])
sum+=stick[i];
if(sum<f[dep]) return 0;
for(int i=s;i<=m;i++)
{
if(stick[i]>=need[dep])
{
stick[i]-=need[dep];
mx|=dfs(dep-1,need[dep]==need[dep+1]?i:1);
stick[i]+=need[dep];
if(mx) return 1;
}
}
return mx;
}
int main()
{
scanf("%d",&m_);
for(int i=1;i<=m_;i++) scanf("%d",stick+i);
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",need+i),mi=mi<need[i]?mi:need[i];
for(int i=1;i<=m_;i++)
if(stick[i]>=mi)
stick[++m]=stick[i];
std::sort(need+1,need+1+n);
for(int i=1;i<=n;i++) f[i]=f[i-1]+need[i];
if(!m) return puts("0"),0;
int l=1,r=n;
while(l<r)
{
int mid=l+r+1>>1;
if(dfs(mid,1)) l=mid;
else r=mid-1;
}
printf("%d\n",l);
return 0;
}

2018.10.10

洛谷 P2329 [SCOI2005]栅栏 解题报告的更多相关文章

  1. 洛谷 P1783 海滩防御 解题报告

    P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...

  2. 洛谷 P4597 序列sequence 解题报告

    P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...

  3. 洛谷1087 FBI树 解题报告

    洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...

  4. 洛谷 P2345 奶牛集会 解题报告

    P2345 奶牛集会 题目背景 MooFest, 2004 Open 题目描述 约翰的N 头奶牛每年都会参加"哞哞大会".哞哞大会是奶牛界的盛事.集会上的活动很 多,比如堆干草,跨 ...

  5. 洛谷 P3349 [ZJOI2016]小星星 解题报告

    P3349 [ZJOI2016]小星星 题目描述 小\(Y\)是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有\(n\)颗小星星,用\(m\)条彩色的细线串了起来,每条细线连着两颗小星星. 有一 ...

  6. 洛谷 P3177 树上染色 解题报告

    P3177 [HAOI2015]树上染色 题目描述 有一棵点数为\(N\)的树,树边有边权.给你一个在\(0\) ~ \(N\)之内的正整数\(K\),你要在这棵树中选择\(K\)个点,将其染成黑色, ...

  7. 洛谷 P4705 玩游戏 解题报告

    P4705 玩游戏 题意:给长为\(n\)的\(\{a_i\}\)和长为\(m\)的\(\{b_i\}\),设 \[ f(x)=\sum_{k\ge 0}\sum_{i=1}^n\sum_{j=1}^ ...

  8. 洛谷 P1272 重建道路 解题报告

    P1272 重建道路 题目描述 一场可怕的地震后,人们用\(N\)个牲口棚\((1≤N≤150\),编号\(1..N\))重建了农夫\(John\)的牧场.由于人们没有时间建设多余的道路,所以现在从一 ...

  9. 洛谷 [HNOI2014]道路堵塞 解题报告

    [HNOI2014]道路堵塞 题意 给一个有向图并给出一个这个图的一个\(1\sim n\)最短路,求删去这条最短路上任何一条边后的最短路. 又事SPFA玄学... 有个结论,新的最短路一定是\(1\ ...

随机推荐

  1. Linux文件服务器实战(匿名用户)

    一.进程与线程 二.vsftp服务器 1.文件传输协议(file transfer protocol,FTP) 基于该协议ftp客户端和服务端实现文件共享,上传下载文件 FTP基于TCP协议生成一个虚 ...

  2. python基础回顾笔记

    1.知道了什么是编程语言 2.知道了python.C#.Java都是语言的种类 3.python:有很多种 cpython.pypy.jpython... 4.python的执行方式有两种: 解释器 ...

  3. php-5.6.26源代码 - 如何用C语言支持“类似异常”机制

    代码编写在文件php-\Zend\zend.h #define zend_bailout() _zend_bailout(__FILE__, __LINE__) #ifdef HAVE_SIGSETJ ...

  4. MLT教程:从BXL文件导入Altium Designer原理图封装和PCB封装

    在TI官网的封装文件中提供弄BXL文件可以导出Altium Designer的封装库和原理图库. 这个界面往下面拉会看到: 然后可以下载各种封装的bxl文件了.下面视频说明bxl文件如何导出成功. 如 ...

  5. C语言数组篇(二)指针数组和数组指针

    数组指针 和 指针数组         这两个名词可以说是经常搞混了         数组指针--> 数组的指针       就是前面讲的 指向数组a的指针p;         指针数组--&g ...

  6. 通过aop添加日志管理

    1.使用spring 的 aop 技术切到自定义注解上,所以先创建一个自定义注解类 import java.lang.annotation.*; @Target(ElementType.METHOD) ...

  7. WPF 加载等待动画

    原文:WPF 加载等待动画 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_29844879/article/details/80216587 ...

  8. The GNU C Library

    Any Unix-like operating system needs a C library: the library which defines the ``system calls'' and ...

  9. Postman-进阶(2)

    Postman-进阶(2) Postman-简单使用 Postman-进阶使用 Postman-CI集成Jenkins 管理请求 保存请求-添加“打开百度首页请求” 设置请求方式为Get,地址为www ...

  10. hadoop进阶

    Java 多线程安全机制 1.操作系统有两个容易混淆的概念,进程和线程. 进程:一个计算机程序的运行实例,包含了需要执行的指令:有自己的独立地址空间,包含程序内容和数据:不同进程的地址空间是互相隔离的 ...