[SCOI2005]栅栏

原创 2016年08月29日 10:47:13

这个经过大神同学的指导啊。终于回了啊。
前缀数组+二分+判重
浪费的+需要的比总值还多就Break
就是这么多啦。
提交传送门
Description

农夫约翰打算建立一个栅栏将他的牧场给围起来,因此他需要一些特定规格的木材。于是农夫约翰到木材店购买木材。可是木材店老板说他这里只剩下少部分大规格的木板了。不过约翰可以购买这些木板,然后切割成他所需要的规格。而且约翰有一把神奇的锯子,用它来锯木板,不会产生任何损失,也就是说长度为10的木板可以切成长度为8和2的两个木板。你的任务:给你约翰所需要的木板的规格,还有木材店老板能够给出的木材的规格,求约翰最多能够得到多少他所需要的木板。

Input

第一行为整数m(m<= 50)表示木材店老板可以提供多少块木材给约翰。紧跟着m行为老板提供的每一块木板的长度。接下来一行(即第m+2行)为整数n(n <= 1000),表示约翰需要多少木材。接下来n行表示他所需要的每一块木板的长度。木材的规格小于32767。(对于店老板提供的和约翰需要的每块木板,你只能使用一次)。

Output

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

Sample Input

4
30
40
50
25
10
15
16
17
18
19
20
21
25
24
30

Sample Output

7

#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,l,r,mid,ans,d,sum;
int a[11000],b[11000],v[10100];
bool dfs(int k,int t){
    if(k==0)return true;
    if(d+v[mid]>sum)return false;
    bool bk;
    for(int i=t;i<=m;i++){
        if(b[i]>=a[k]){
            b[i]-=a[k];
            if(b[i]<a[1])d+=b[i];
            if(a[k-1]==a[k])bk=dfs(k-1,i);
            else bk=dfs(k-1,1);
            if(b[i]<a[1])d-=b[i];
            b[i]+=a[k];
            if(bk==true)return true;
        }
    }
    return false;
}
int main(){
    sum=0;
    scanf("%d",&m);
    for(int i=1;i<=m;i++){
        scanf("%d",&b[i]);sum+=b[i];
    }
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    sort(a+1,a+n+1);sort(b+1,b+m+1);
    v[0]=0;for(int i=1;i<=n;i++)v[i]=v[i-1]+a[i];
    while(v[n]>sum)n--;
    l=1;r=n;ans=0;d=0;
    while(l<=r){
        mid=(l+r)/2;
        if(dfs(mid,1)==true){
            l=mid+1;ans=mid;
        }
        else r=mid-1;
    }
    printf("%d\n",ans);
    return 0;
}
版权声明:原创文章,请转载表明链接

(bzoj 1082)(SCOI2005)栅栏

题目描述 农夫约翰打算建立一个栅栏将他的牧场给围起来,因此他需要一些特定规格的木材。于是农夫约翰到木材店购买木材。可是木材店老板说他这里只剩下少部分大规格的木板了。不过约翰可以购买这些木板,然后切割...
  • ergedathouder
  • ergedathouder
  • 2017年03月17日 14:47
  • 123

【bzoj1082】 SCOI2005 栅栏 二分+搜索

以前听lyp讲过这道题,现在发现自己的搜索还是不太熟练,加了两遍可行性剪枝,结果又WA又T,发现加剪枝和不加完全是两个速度。具体怎么搜的还是看代码吧。 #include #include #...
  • u012288458
  • u012288458
  • 2015年07月20日 17:11
  • 283

[SCOI2005]骑士精神

Description在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位。在任何时候一个骑士都能按照骑士的走法移动到空位上。 给定一个初始的棋盘,怎样才能经过移动变成如下目标棋盘...
  • xgc_woker
  • xgc_woker
  • 2016年08月25日 14:50
  • 593

无锁编程与内存栅栏

原子指针
  • lizhihaoweiwei
  • lizhihaoweiwei
  • 2016年01月25日 19:45
  • 1007

栅栏效应、频谱泄露、细化技术

fft在分析频谱分析的时候,会有下面四个方面的误差: (1)频谱混叠       奈奎斯特定理已被众所周知了,所以几乎所有人的都知道为了不让频谱混叠,理论上采样频谱大于等于信号的最高频率。那和时域上联...
  • rhaiyan
  • rhaiyan
  • 2015年06月24日 11:02
  • 2665

Java并发学习笔记(四)-栅栏CyclicBarrier

闭锁是一次性对象,一旦进入终止状态,就不能被重置,它是用来启动一组相关的操作,或者等待一组相关的操作结束。 栅栏跟闭锁有点类似,它能阻塞一组线程直到某个时间发生,但是这里有个很大的区别,在栅栏里,只有...
  • wujumei1962
  • wujumei1962
  • 2015年02月03日 21:54
  • 2511

Bootstrap 栅栏系统

栅栏系统是通过定义容器大小,并将其等分12份,通过一系列行(row)与列(column),结合媒体查询制作成强大的响应式栅格系统。工作原理: 数据行(row)必须包含在 .container(固定宽度...
  • conatic
  • conatic
  • 2017年03月22日 20:27
  • 1002

java多线程九 栅栏CyclicBarrier

CyclicBarrier是一个同步工具类,它允许一组线程在到达某个栅栏点(common barrier point)互相等待,发生阻塞,直到最后一个线程到达栅栏点,栅栏才会打开,处于阻塞状态的线程恢...
  • yin380697242
  • yin380697242
  • 2016年11月23日 22:49
  • 1678

java多线程并发系列之闭锁(Latch)和栅栏(CyclicBarrier)

-闭锁(Latch) 闭锁(Latch):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态。通俗的讲就是,一个闭锁相当于一扇大门,在大门打开之前所有线程都被阻断,一旦大门打开所有...
  • yujin753
  • yujin753
  • 2015年05月28日 16:45
  • 6407

一种嵌套式栅栏布局的对齐方式

在bootstrap的应用中,经常需要对栅格进行嵌套布局,但也因为如此,很容易出现内容无法对齐的现象。UI给定的要求是两栏表格布局,文字与输入框的占比为1:3,详细布局文件见下图。 几乎不用思考,我...
  • yiifaa
  • yiifaa
  • 2017年02月20日 16:46
  • 331
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[SCOI2005]栅栏
举报原因:
原因补充:

(最多只允许输入30个字)