Dp

题目背景

SOURCE:NOIP2015-SHY-10

题目描述

一块土地有 n 个连续的部分,用 H[1],H[2],…,H[n] 表示每个部分的最初高度。有 n 种泥土可用,他们都能覆盖连续的 k 个部分,第 i 种泥土的价格为 C[i],可以使 i,i+1,…,i+k-1 部分的高度增加 E[i](如果 i+k>n,那就覆盖 i,…,n ),我们必须满足以下条件:

1、每种泥土只能使用一次。

2、成本必须小于等于 m 。

要求在上述条件下,使得最低的部分的高度尽量高,请求出这个高度。

输入格式

第一行三个整数 n,m,k,表示土地有几个部分,最大预算成本以及每种泥土能覆盖的部分数。

接下来 n 行,每行三个整数 H[i],E[i],C[i]。

输出格式

输出一个整数,表示在满足条件的情况下,最低部分的高度的最大值。

样例数据 1

输入

4 20 1

1 3 5

1 7 3

4 6 9

3 5 13

输出

3

备注

【数据范围】

对 30% 的输入数据:1≤n≤20 。

对 100% 的输入数据:1≤k≤11;1≤n≤100;0≤m;H[i],E[i],C[i]≤10^6 。

一看题就知道要二分,关键在于怎么check(考试的时候没想出来)。

本来想写个搜索骗个分的,结果发现有点慢,就换了个贪心+搜索,仍然只有30pts233,虽然得分点跟别人不一样。。。

所以说整体思路就出来了,二分答案,然后状压每个人的前k个人的选取情况转移就行了,如果最后在满足所有人都大于mid的情况下总花费最小值是不超过m的说明情况合法。

代码:

#include<bits/stdc++.h>
using namespace std;
inline int read(){
    int ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
int n,m,k,h[105],e[105],c[105],sum[105][2050],l=0x3f3f3f3f,r,mk,f[105][2050],bit[15],ans;
inline bool check(int mid){
    memset(f,0x3f3f3f3f,sizeof(f));
    f[0][0]=0;
    for(int i=1;i<=n;++i){
        int pos=min(k,i),up=bit[pos];
        bool ff=false;
        for(int j=0;j<up;++j){
            if(sum[i][j]+h[i]<mid)continue;
            f[i][j]=min(f[i][j],f[i-1][(j>>1)]+(j&1?c[i]:0));
            f[i][j]=min(f[i][j],f[i-1][((j>>1)|bit[pos-1])]+(j&1?c[i]:0));
            if(f[i][j]>m)f[i][j]=0x3f3f3f3f;
            else ff=true;
        }
        if(!ff)return false;
    }
    for(int i=0;i<=mk;++i)if(f[n+1][i]<=m)return true;
    return true;
}
int main(){
    n=read(),m=read(),k=read();
    int pos,up;
    for(int i=0;i<=k;++i)bit[i]=1<<i;
    for(int i=1;i<=n;++i){
        h[i]=read(),e[i]=read(),c[i]=read(),pos=min(k,i),up=bit[pos];
        for(int j=0;j<up;++j){
            for(int t=0;t<pos;++t)
                sum[i][j]+=(j&bit[t]?e[i-t]:0);
        }
    }
    l=0,r=1000000005;
    while(l<=r){
        int mid=l+r>>1;
        if(check(mid))l=mid+1,ans=mid;
        else r=mid-1;
    }
    cout<<ans;
    return 0;
}

2018.08.19 NOIP模拟 dp(二分+状压dp)的更多相关文章

  1. 2018.08.29 NOIP模拟 movie(状压dp/随机化贪心)

    [描述] 小石头喜欢看电影,选择有 N 部电影可供选择,每一部电影会在一天的不同时段播 放.他希望连续看 L 分钟的电影.因为电影院是他家开的,所以他可以在一部电影播放过程中任何时间进入或退出,当然他 ...

  2. 2018.10.17 NOIP模拟 管道(状压dp)

    传送门 状压dp好题. 怎么今天道道题都有点东西啊 对于今天题目神仙出题人先膜为上策:%%%%DzYoAk_UoI%%%% 设f[i][j]f[i][j]f[i][j]表示选取点的状态集合为iii,当 ...

  3. 2018.08.19 NOIP模拟 number(类数位dp)

    Number 题目背景 SOURCE:NOIP2015-SHY-10 题目描述 如果一个数能够表示成两两不同的 3 的幂次的和,就说这个数是好的. 比如 13 是好的,因为 13 = 9 + 3 + ...

  4. 2018.09.08 NOIP模拟 division(状压dp)

    这么sb的题考场居然写挂了2233. 假设n=∏iaiki" role="presentation" style="position: relative;&qu ...

  5. 2018.08.19 NOIP模拟 change(简单模拟)

    Change 题目背景 SOURCE:NOIP2015-SHY-10 题目描述 Alice 和 Bob 又聚在一起了!他们已经厌倦了取石子游戏,现在他们热衷于切题.于是,Alice 找到了一道题让 B ...

  6. NOIp模拟赛 巨神兵(状压DP 容斥)

    \(Description\) 给定\(n\)个点\(m\)条边的有向图,求有多少个边集的子集,构成的图没有环. \(n\leq17\). \(Solution\) 问题也等价于,用不同的边集构造DA ...

  7. 树形DP和状压DP和背包DP

    树形DP和状压DP和背包DP 树形\(DP\)和状压\(DP\)虽然在\(NOIp\)中考的不多,但是仍然是一个比较常用的算法,因此学好这两个\(DP\)也是很重要的.而背包\(DP\)虽然以前考的次 ...

  8. dp乱写1:状态压缩dp(状压dp)炮兵阵地

    https://www.luogu.org/problem/show?pid=2704 题意: 炮兵在地图上的摆放位子只能在平地('P') 炮兵可以攻击上下左右各两格的格子: 而高原('H')上炮兵能 ...

  9. poj2411 Mondriaan's Dream (轮廓线dp、状压dp)

    Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 17203   Accepted: 991 ...

随机推荐

  1. jquery checkbox

    $(document).ready(function() { var $cr = $("#cr"); var cr = $cr[0]; $cr.click(function() { ...

  2. java基础思维导图,让java不再难懂

    java基础思维导图,让java不再难懂 原文链接  https://my.oschina.net/u/3080373/blog/873056 最近看了一些文章的思维导图,发现思维导图真是个强大的工具 ...

  3. vue 项目部署后 刷新一下 页面找不到 解决

    1.修改配置router的参数  (效果不好) 2. (不能解决 出现403) 后端配置例子 Apache <IfModule mod_rewrite.c> RewriteEngine O ...

  4. HttpClient获取返回类型为JSON或XML的数据

    Java_HttpClient获取返回类型为JSON或XML的数据 原创 2017年04月06日 17:38:29 706 HttpClient 获取返回类型为JSON或XML的数据 使用httpco ...

  5. python os模块常用命令

    python编程时,经常和文件.目录打交道,这是就离不了os模块.os模块包含普遍的操作系统功能,与具体的平台无关.以下列举常用的命令 1. os.name()——判断现在正在实用的平台,Window ...

  6. unity 加载读取外部XML

    cfg.xml <rootNode> <category name="网站"> <item name="mainPage"> ...

  7. MySql PartionBy

    SELECT tableOld.*, if(@channelName = tableOld.channelName, @rank := @rank + 1, @rank := 1) AS rank, ...

  8. PowerDesigner表生成 EXCEL

    今天收到一个需求,要把数据库设计给一个excel版本的,百度出来一个脚本文件,很好用发现,留个纪念 在pd中,shift+ctrl+X,打开脚本运行,脚本如下,附件也留了一份: '********** ...

  9. HttpClient 发送 HTTP、HTTPS

    首先说一下该类中需要引入的 jar 包,apache 的 httpclient 包,版本号为 4.5,如有需要的话,可以引一下.     代码 import org.apache.commons.io ...

  10. Swagger与SpringMVC整合

    依赖管理   在整合之前,需要把所有使用到的依赖包全部引入.网上很多文章只是简单告诉读者引入swagger-springmvc-1.0.2.jar包,但是随后你发现这远远不够,还需要很多包,如下所示: ...