题目描述
有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。
    输入格式
    第一行一个正整数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)。
    输出格式
    输出q行,每行为TAK (yes)或NIE (no),第i行对应第i此询问的答案。
    输入样例

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

输出样例

TAK

NIE

TAK

TAK

NIE

分析

看起来像个背包,但是它是有限制的。

由于物品无序,所以对于第一个限制,可以按a从小到大排序,一个一个放入背包并记录,回答时直接二分一下位置就好了。

我们发现这个题目比以往的题目少了一条限制,即物品的个数。

而且k很小,这个题只需要回答yes和no

所以直接考虑dp[i][j],表示选前i个物品c的和为j时,所用物品的b的最大值,直接转移即可

这样的话,对于每个问题,

第一个限制直接二分得到a中最后一个小于等于m的位置i

第二个直接看dp[i][k]是否大于m+s,大于则输出yes,反之输出no。

但发现好像内存开不下,所以离线处理询问,再像完全背包一样去dp,一边做一边记录答案

代码如下

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1005;
struct node{int m,k,s,id;}que[1000005];
int n,Q,a[maxn],b[maxn],c[maxn],q[maxn],w[maxn],ans[1000005],dp[100005];
bool cmp(int x,int y){return a[x]<a[y];}
bool cmp1(node a,node b){return a.m<b.m;}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d%d%d",&c[i],&a[i],&b[i]),w[i]=a[q[i]=i];scanf("%d",&Q);for(int i=1;i<=Q;i++)scanf("%d%d%d",&que[i].m,&que[i].k,&que[i].s),que[i].id=i;sort(w+1,w+1+n);sort(q+1,q+1+n,cmp);sort(que+1,que+1+Q,cmp1);int K=1;dp[0]=1e9;for(int i=1,sum=0;i<=n;i++){while(K<=Q&&que[K].m<w[i])ans[que[K].id]=(dp[que[K].k]>que[K].m+que[K].s),K++;sum+=c[q[i]];sum=min(sum,100000);for(int j=sum;j>=c[q[i]];j--)dp[j]=max(dp[j],min(dp[j-c[q[i]]],b[q[i]]));}while(K<=Q)ans[que[K].id]=(dp[que[K].k]>que[K].m+que[K].s),K++;for(int i=1;i<=Q;i++)if(ans[i])puts("TAK");else puts("NIE");
}

【洛谷】P3537 [POI2012]SZA-Cloakroom相关推荐

  1. 洛谷 P3539 [POI2012]ROZ-Fibonacci Representation 解题报告

    P3539 [POI2012]ROZ-Fibonacci Representation 题意:给一个数,问最少可以用几个斐波那契数加加减减凑出来 多组数据10 数据范围1e17 第一次瞬间yy出做法, ...

  2. BZOJ2801/洛谷P3544 [POI2012]BEZ-Minimalist Security(题目性质发掘+图的遍历+解不等式组)...

    题面戳这 化下题面给的式子: \(z_u+z_v=p_u+p_v-b_{u,v}\) 发现\(p_u+p_v-b_{u,v}\)是确定的,所以只要确定了一个点\(i\)的权值\(x_i\),和它在同一 ...

  3. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  4. 洛谷 P1142 轰炸

    洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...

  5. 洛谷 P1387 最大正方形

    P1387 最大正方形 题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=10 ...

  6. 洛谷P2763 试题库问题

    题目:https://www.luogu.org/problemnew/show/P2763 题目描述 «问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性. ...

  7. 动态规划——洛谷_P1057传球游戏

    题目: 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏.游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球, ...

  8. 洛谷P1417 烹调方案

    洛谷P1417 烹调方案 如果是一般的01背包的话 选的先后是没关系的 但是这题选的先后是有关系的,因为他的价值是随着时间而变化的, 而你的01背包是做不到先选2再选1的 那么我们就跟国王游戏一样 用 ...

  9. 记忆优化搜索(简单题)(洛谷P3183 [HAOI2016]食物链 )( P5635 【CSGRound1】天下第一 )

    昨天做了蓝桥杯的时候,发现自己对于记忆优化搜索甚是不熟悉,所以今天随便找了几个基础题做做,顺便写下两片题解,顺便用了一下devc++敲的代码,发现没有代码补全真的可以说是灰常难受了... 洛谷P318 ...

  10. 洛谷 - 试炼场(全部题目备份)

    整理的算法模板合集: ACM模板 目录 1.新手村 1 - 1 洛谷的第一个任务 1 - 2 顺序与分支 1 - 3 循环!循环!循环! 1 - 4 数组 1 - 5 简单字符串 1 - 6 过程函数 ...

最新文章

  1. Python:生成两个日期间的随机日期
  2. c++ iou学习笔记
  3. 24、Cocos2dx 3.0游戏开发找小三之网格动作:高炫酷的3D动作
  4. html+监听+页面滚动到底部,解决HTML5中滚动到底部的事件问题
  5. jsonp模拟获取百度搜索相关词汇
  6. 掌控谈话~让对方说“不”
  7. 嵌入式 Linux 入门 环境篇(四、必备开发工具安装)
  8. 笔记本计算机涂硅脂,笔记本电脑怎么涂cpu散热硅脂
  9. 网络安全求职该怎么写简历?
  10. 科技爱好者周刊:第 61 期
  11. Web前端之HTML+CSS的知识总结
  12. 业务架构是战略,应用架构是战术,技术架构是装备
  13. CH32V103C8T6入门指导
  14. Vue.js---关闭语法检查
  15. Ureport2的表格更改小技巧
  16. 一招学会绘制UI图标超椭圆
  17. 投入OJ的怀抱~~~~~~~~~~
  18. 基于单片机住宅家庭防盗报警系统设计-毕设课设资料
  19. 英语美句-每日积累-03
  20. 硬件工程师成长之路(11)——职业规划

热门文章

  1. juniper认证(JNCIA,JNCIS,JNCIP,JNCIE)介绍
  2. 动态规划算法——2020美团校招合并金币算法
  3. php怎么黑admin管理员密码是什么,tplink管理员密码是什么?
  4. odoo rest api 服务接口
  5. 混淆矩阵 confusion matrices
  6. 街头篮球服务器维护,《街头篮球》4月23日新版活动抢先看
  7. 【Linux】【操作】Linux操作集锦系列之一——定时任务
  8. 2021年全国安全生产月 安全知识网络竞赛 链工宝“测测你的安全力”题库 三百多道真题含答案
  9. 使用PQ分区魔术师与DiskGenius合并主分区与逻辑分区
  10. 在一夜暴富之前,我先一夜秃了头