正题

题目链接:https://ac.nowcoder.com/acm/contest/11169/E


题目大意

给出nnn个三元组(ai,bi,ci)(a_i,b_i,c_i)(ai​,bi​,ci​)。

要求选出一个集合SSS,要求
(∑i∈Sai)≤P,(∑i∈Sbi)≥P\left(\sum_{i\in S}a_i\right)\leq P,\left(\sum_{i\in S}b_i\right)\geq P(i∈S∑​ai​)≤P,(i∈S∑​bi​)≥P
且最小化∑i∈Sci\sum_{i\in S}c_i∑i∈S​ci​

1≤T≤5,1≤n≤1000,1≤P≤10000,1≤ai≤bi≤2×106,1≤ci≤2×1061\leq T\leq 5,1\leq n\leq 1000,1\leq P\leq 10000,1\leq a_i\leq b_i\leq 2\times 10^6,1\leq c_i\leq 2\times 10^61≤T≤5,1≤n≤1000,1≤P≤10000,1≤ai​≤bi​≤2×106,1≤ci​≤2×106


解题思路

暴力的思路是设fi,l,rf_{i,l,r}fi,l,r​表示到第iii个,aia_iai​的和为lll,bib_ibi​的和为rrr时的最小值。

但是这个O(nP2)O(nP^2)O(nP2)的显然不行,发现有一个ai≤bia_i\leq b_iai​≤bi​的性质考虑怎么使用。

其实还要一个相关的性质就是两个的限制的PPP是相等的,虽然看起来比较废话但确实是有用的。

一个十分巧妙的dpdpdp是设fi,jf_{i,j}fi,j​表示aia_iai​的和≤j\leq j≤j且bib_ibi​的和≥j\geq j≥j。虽然这样的限制不完全,但是这样确实可以统计到最小答案且不会统计到更小答案。

转移就是
fi,j=min{fi−1,j,fi−1,p+ci}(p∈[j−bi,j−ai])f_{i,j}=min\{f_{i-1,j},f_{i-1,p}+c_i\}(p\in[j-b_i,j-a_i])fi,j​=min{fi−1,j​,fi−1,p​+ci​}(p∈[j−bi​,j−ai​])

这样每一层用单调队列维护就可以了

时间复杂度O(TnP)O(TnP)O(TnP)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=1100;
ll T,n,P,a[N],b[N],c[N],f[N][N*10],q[N*10];
signed main()
{scanf("%lld",&T);while(T--){scanf("%lld%lld",&n,&P);for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);for(ll i=1;i<=n;i++)scanf("%lld",&b[i]);for(ll i=1;i<=n;i++)scanf("%lld",&c[i]);memset(f,0x3f,sizeof(f));f[0][0]=0;for(ll i=1;i<=n;i++){ll tail=0,head=1,z=-1;for(ll j=0;j<=P;j++){f[i][j]=f[i-1][j];ll l=j-b[i],r=j-a[i];while(z<r){z++;if(f[i-1][z]>=1e18)continue;while(head<=tail&&f[i-1][q[tail]]>f[i-1][z])tail--;q[++tail]=z;}while(head<=tail&&q[head]<l)head++;if(head<=tail)f[i][j]=min(f[i][j],f[i-1][q[head]]+c[i]);}}if(f[n][P]>=1e18)printf("IMPOSSIBLE!!!\n");else printf("%lld\n",f[n][P]); }return 0;
}

牛客练习赛79E-小G的数学难题【dp,单调队列】相关推荐

  1. 牛客练习赛79E小G的数学难题

    https://ac.nowcoder.com/acm/contest/11169/E 挺有意思的一道题 可以考虑放缩 可以把每个aia_iai​放大,若仍然满足条件,那原问题也满足条件 同理把每个b ...

  2. 牛客练习赛77 小G的约数(整除分块)

    其中 1 有 n 个,2 有 n/2 个.......可以发现 :所以只要在一定时间内解决即可,由于可以利用整除分块解决 ,所以两遍递归即可 ll go(ll n) {return n*(n+1)/2 ...

  3. 牛客练习赛59 小松鼠吃松果(优化dp二维偏序)

    小松鼠吃松果 非常nicenicenice的一道题 首先考虑dpdpdp 容易想到按照时间来排序 然后定义dp[i]dp[i]dp[i]为考虑前iii个果子且吃掉第iii个的最大价值 那么每次都去前面 ...

  4. 【牛客 - 696D】小K的雕塑(dp,鸽巢原理,01背包类问题)

    题干: 链接:https://ac.nowcoder.com/acm/contest/696/D 来源:牛客网 小K有n个雕塑,每个雕塑上有一个整数 若集合T中的每一个元素在n个雕塑上都能找得到,则称 ...

  5. 牛客小白月赛16 D-小阳买水果(单调队列)

    链接:https://ac.nowcoder.com/acm/contest/949/D 来源:牛客网 题目描述 水果店里有 n个水果排成一列.店长要求顾客只能买一段连续的水果. 小阳对每个水果都有一 ...

  6. 牛客练习赛56 小魂和他的数列

    小魂和他的数列 题目链接 题目大意 给出一个数列,让求长度为k的严格递增子序列有多少个 怎么做呢? 显然dp 这个是很好想的 for (int i= 1; i <= n; i ++ ){dp[i ...

  7. 牛客练习赛81 小Q与彼岸花 (分块+可持久化01trie)

    题意: 题解:因为这个题目是弱化以后的,正常的范围是5e4 . 看了官方题解去学习了一波可持久化01trie然后回来把这个题补完. 可持久数据结构其实就是我们的数据结构的内容会不断发生变化,而我们还要 ...

  8. 牛客练习赛71C-数学考试【容斥,dp】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/7745/C 题目大意 求一nnn的排列,给mmm个限制pip_ipi​表示1∼pi1\sim p_i1∼pi​ ...

  9. 牛客练习赛81 E. 小 Q 与函数求和 1( “简单莫比乌斯反演” ,欧拉函数性质)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 牛客练习赛81 E. 小 Q 与函数求和 1( "简单莫比乌斯反演" ) Prob ...

  10. E-牛牛小数点_牛客练习赛89(数学)

    E-牛牛小数点_牛客练习赛89 (nowcoder.com) 题目描述 牛牛想和点点交朋友, 于是点点给了牛牛一个问题. 定义关于小数 xxx 的函数 f(x)f(x)f(x), 表示 xxx 中两个 ...

最新文章

  1. 115页Slides带你领略深度生成模型全貌(附PPT)
  2. NetBeans 时事通讯(刊号 # 146 - May 13, 2011)
  3. java反码补码原码作用_java原码补码反码关系解析
  4. Spring MVC开发–快速教程
  5. Android接口一般定义格式,Android开发规范
  6. 微信小程序 公众号 订阅消息 模板 正则 参数校验
  7. nested exception is java.lang.NumberFormatException: For input string: “swagger-ui.html“]
  8. python 爬取财经新闻_Python爬虫并自制新闻网站,太好玩了
  9. 怎么用计算机磁盘管理分区,在win 7中如何用磁盘管理为硬盘分区呢?
  10. the little schemer 笔记(8)
  11. 阿里云服务器遭到攻击怎么办?
  12. 当前计算机与医学结合的研究热点,浅谈医学影像技术的现在与未来论文范文
  13. canvas文字旋转功能
  14. asterisk安装、配置
  15. 架构师之路---架构的演变详解
  16. 七种常见阈值分割代码(Otsu、最大熵、迭代法、自适应阀值、手动、迭代法、基本全局阈值法)...
  17. 如何建立用户画像和用户体系?
  18. 五款经典GPRS无线上网卡比拼 1
  19. DeepCham: Collaborative Edge-Mediated Adaptive Deep Learning for Mobile Object Recognition
  20. Greenplum数据库查看表倾斜的方法总结

热门文章

  1. 按id进行查找按名称进行排序_Excel工作表中如何按需要的顺序快速进行排序
  2. python ctp接口_使用ctp的python接口
  3. oracle 12c 多线程,Oracle 12c(12.1)中性能优化功能增强之通过参数THREADED_EXECTION使用多线程模型...
  4. python hexdigest,Java方法,可以为Hex中的HMAC-SHA256提供与Python方法相同的输出
  5. [RabbitMQ]消息应答概念_消息手动应答代码
  6. [PAT乙级]1007 素数对猜想
  7. [Java基础]LinkedList集合的特有功能
  8. C++实现链式存储线索二叉树
  9. 使用对偶表示重新实现Stack(lua程序设计21.7练习21.3题)
  10. lua实现继承(lua程序设计21.7 练习21.2题)