[Poi 2012] bzoj2794 Cloakroom [dp]

原创 2018年04月16日 19:19:39

Description:
n件物品,每件物品有三个属性a[i],b[i],c[i](a[i]<b[i])
再给出q个询问,每个询问由非负整数m,k,s组成,问是否能够选出某些物品使得:
1. 对于每个选的物品i,满足a[i]<=mb[i]>m+s
2. 所有选出物品的c[i]的和正好是k


Solution:
先按a离线排序,现在问题在于b。那么我们用c做背包,求出b的最大最小值即可。


#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1e6 + 5;
struct data_1 {
    int a, b, c;
    bool friend operator < (const data_1 &a, const data_1 &b) {
        return a.a < b.a;
    }
} a[maxn];
struct data_2 {
    int m, s, k, id;
    bool friend operator < (const data_2 &a, const data_2 &b) {
        return a.m < b.m;
    }
} b[maxn];
int n, m;
int dp[maxn], ans[maxn];
int main() {
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i) {
        scanf("%d%d%d", &a[i].c, &a[i].a, &a[i].b);
    }
    sort(a + 1, a + n + 1);
    scanf("%d", &m);
    for(int i = 1; i <= m; ++i) {
        scanf("%d%d%d", &b[i].m, &b[i].k, &b[i].s);
        b[i].id = i;
    }
    sort(b + 1, b + m + 1);
    dp[0] = 1e9;
    for(int i = 1, j = 0; i <= m; ++i) {
        while(j < n && b[i].m >= a[j + 1].a) {
            ++j;
            for(int k = 100000; k >= a[j].c; --k) {
                dp[k] = max(dp[k], min(dp[k - a[j].c], a[j].b));
            }
        }
        if(dp[b[i].k] > b[i].m + b[i].s) {
            ans[b[i].id] = 1;
        }
    }
    for(int i = 1; i <= m; ++i) {
        puts(ans[i] ? "TAK" : "NIE");
    }
    return 0;
}

[POI 2012]Cloakroom(DP)

题目链接http://main.edu.pl/en/archive/oi/19/sza题目大意有n件物品,每件物品有三个属性a[i], b[i], c[i] (a[i]...
  • qpswwww
  • qpswwww
  • 2015年05月15日 21:57
  • 560

BZOJ2794 [Poi2012]Cloakroom

离线,把询问和物品按m和a排序,每次把a小于等于当前m的物品加进来,f[i]表示用b尽可能大的物品凑出i,b最小的那个是多少,然后判f[s]是否大于m+k即可 #include #include #...
  • neither_nor
  • neither_nor
  • 2016年08月24日 15:11
  • 239

BZOJ2794/POI2012 Cloakroom

Task 有n件物品,每件物品有三个属性a[i], b[i], c[i] .(a[i]<b[i]) 再给出q个询问,每个询问由非负整数m, k, s组成,问是否能够选出某些物品使得: 1. 对于...
  • LIN452
  • LIN452
  • 2016年10月08日 22:41
  • 289

BZOJ2794: [Poi2012]Cloakroom

题目大意:n个物品有三个属性a,b,c,q个询问每次给出m,k,s,问能不能在物品中选出一些使得每个的a≤m,b>m+s,c的和正好等于k 看完题感觉无从下手.... 然后就去翻了题解,感...
  • commonc
  • commonc
  • 2016年06月23日 18:44
  • 769

bzoj2794 [Poi2012]Cloakroom ( 背包DP+离线 )

bzoj2794 [Poi2012]Cloakroom原题地址:http://www.lydsy.com/JudgeOnline/problem.php?id=2794题意: 有n件物品,每件物品有...
  • Bfk_zr
  • Bfk_zr
  • 2017年10月07日 07:50
  • 131

[BZOJ 2791]POI2012 Rendezvous

逗逗逗,一开始看错了题目,然后杯具了一个多小时。。。。。 看明白了题目还是思路还是很直观的。 首先若果两个点的在环之外就可以走到一起,很明显这就是最优解。 如果在环内的话,那么我们分找出两个点第...
  • Zeyu_King
  • Zeyu_King
  • 2014年12月16日 21:43
  • 475

bzoj 2794 [Poi2012]Cloakroom dp

一开始写了个线段树,每个节点维护个背包,然后发现查询时没法合并,就gg了。先把所有点按m和a[i]排序。然后就是支持添加物品,询问能组成k的b[i]的最小值最大。然后直接dp就好了。#include ...
  • make_it_for_good
  • make_it_for_good
  • 2016年11月15日 09:45
  • 117

BZOJ 2792 Poi2012 Well 二分答案

题目大意:给定一个非负整数序列AA,每次操作可以选择一个数然后减掉1,要求进行不超过mm次操作使得存在一个Ak=0A_k=0且max{Ai−Ai+1}max\{A_i-A_{i+1}\}最小,输出这个...
  • PoPoQQQ
  • PoPoQQQ
  • 2015年06月08日 14:29
  • 1658

[树形DP 启发式合并 神题] BZOJ 4543 [POI2014]Hotel加强版 & BZOJ 3522 [Poi2014]Hotel

%%%神犇的题解 转移不难想 关键是空间和时间 空间用轻重链的思想和指针转移  时间么 指针转移&启发式合并 复杂度的证明比较巧妙 “任意设一点作为根。令 f(a, d) 表示在以 ...
  • u014609452
  • u014609452
  • 2016年05月18日 21:31
  • 1499

poi2012 切题记

19th Polish Olympiad in Informatics Tasks Festival (Stage I) (100/100) Letters (Stage I) (100/...
  • lych_cys
  • lych_cys
  • 2016年05月12日 15:33
  • 717
收藏助手
不良信息举报
您举报文章:[Poi 2012] bzoj2794 Cloakroom [dp]
举报原因:
原因补充:

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