bzoj2794 [Poi2012]Cloakroom ( 背包DP+离线 )
来源:互联网 发布:ubuntu 双系统 主分区 编辑:程序博客网 时间:2024/05/29 02:26
bzoj2794 [Poi2012]Cloakroom
原题地址:http://www.lydsy.com/JudgeOnline/problem.php?id=2794
题意:
有n件物品,每件物品有三个属性a[i], b[i], c[i] (a[i] < b[i])。
再给出q个询问,每个询问由非负整数m, k, s组成,问是否能够选出某些物品使得:
1. 对于每个选的物品i,满足a[i]<=m且b[i]>m+s。
2. 所有选出物品的c[i]的和正好是k。
Input
第一行一个正整数n (n<=1,000),接下来n行每行三个正整数,分别表示c[i], a[i], b[i] (c[i]<=1,000, 1<=a[i] < b[i]<=10^9)。
下面一行一个正整数q (q<=1,000,000),接下来q行每行三个非负整数m, k, s (1<=m<=10^9, 1<=k<=100,000, 0<=s<=10^9)。
Output
输出q行,每行为TAK (yes)或NIE (no),第i行对应第i此询问的答案。
Sample Input
5
6 2 7
5 4 9
1 2 4
2 5 8
1 3 9
5
2 7 1
2 7 2
3 2 0
5 7 2
4 1 5
Sample Output
TAK
NIE
TAK
TAK
NIE
数据范围
n<=1,000,c[i]<=1,000, 1<=a[i] < b[i]<=10^9,q<=1,000,000
题解:
q<=1,000,000,看着就是离线。
现在我们要求三个条件:
1.a[i]<=m
2.b[i]>m+s
3.c[i]和为k
如果我们通过离线来减少约束,那显然是物品按a[i]排序,询问按m排序,每到一个询问,继续把符合(1)的物品加入背包。
那么只要看有没有 所有b[i]>m+s且c[i]和为k的方案即可。
这里给出的方式是f[i]维护的是和刚好为i时,所有方案中,使最小的b值最大的方案 的b值。
这样只需在每次添加完后,看看f[k]是否大于m+s即可。
(这是一个我一直没想到的地方,思路比较僵,总以为背包只能存价值或方案数,而没想到其变式其实可以有很多。最终应该由题目去想问题,不是这个算法可以求什么)
代码:
#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>using namespace std;const int N=1010; const int M=1000010;const int inf=1e9+7;struct node{ int a,b,c;}w[M];bool cmp1(const node &A,const node &B){ return A.a<B.a;}struct query{ int m,k,s,note;}Q[M];bool cmp2(const query &A,const query &B){ return A.m<B.m;}int n,q,f[M],ans[M];int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d%d%d",&w[i].c,&w[i].a,&w[i].b); sort(w+1,w+n+1,cmp1); scanf("%d",&q); int top=100000; for(int i=1;i<=q;i++) { scanf("%d%d%d",&Q[i].m,&Q[i].k,&Q[i].s); Q[i].note=i; } sort(Q+1,Q+q+1,cmp2); int tmp=1; f[0]=inf; for(int i=1;i<=q;i++) { while(tmp<=n&&w[tmp].a<=Q[i].m) { for(int j=top;j>=w[tmp].c;j--) f[j]=max(f[j],min(f[j-w[tmp].c],w[tmp].b)); tmp++; } if(f[Q[i].k]>Q[i].m+Q[i].s) ans[Q[i].note]=1; } for(int i=1;i<=q;i++) { if(ans[i]) printf("TAK\n"); else printf("NIE\n"); } return 0;}
- bzoj2794 [Poi2012]Cloakroom ( 背包DP+离线 )
- BZOJ2794: [Poi2012]Cloakroom
- BZOJ2794 [Poi2012]Cloakroom
- BZOJ2794/POI2012 Cloakroom
- BZOJ2794: [Poi2012]Cloakroom
- BZOJ 2794: [Poi2012]Cloakroom 询问离线 背包dp
- BZOJ 2794: [Poi2012]Cloakroom 背包DP
- bzoj 2794 [Poi2012]Cloakroom dp
- 2794: [Poi2012]Cloakroom
- [POI 2012]Cloakroom(DP)
- bzoj 2798 [Poi2012]Bidding 博弈论 dp
- DP背包
- 背包 dp
- 背包dp
- 背包dp
- DP-背包
- 背包dp
- 背包dp
- 【BZOJ3995】【SDOI2015】道路修建
- [BZOJ2426][HAOI2010] 工厂选址 (神奇的贪心)
- [bzoj-4808]马 题解
- 遇到的保存网页的问题
- JZOJsenior1168.【NOIP动态规划专题】合唱队形
- bzoj2794 [Poi2012]Cloakroom ( 背包DP+离线 )
- luogu 1057 传球游戏
- 第9章 中断和动态时钟显示
- 例题6-3 矩阵链乘 UVA442
- Android ADB emulator-5554 unauthorized
- C#入门--多态(二)
- noip2006 day1 t1 能量项链
- 0【NOIP2013初赛】整除 1铺砖问题 2【NOIP2012初赛】新壳栈 3【NOIP2013初赛】青蛙
- DeepMind成立DMES新部门,旨在研究AI带来的社会伦理问题