正题

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


题目大意

给出\(n\)个三元组\((a_i,b_i,c_i)\)。

要求选出一个集合\(S\),要求

\[\left(\sum_{i\in S}a_i\right)\leq P,\left(\sum_{i\in S}b_i\right)\geq P
\]

且最小化\(\sum_{i\in S}c_i\)

\(1\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^6\)


解题思路

暴力的思路是设\(f_{i,l,r}\)表示到第\(i\)个,\(a_i\)的和为\(l\),\(b_i\)的和为\(r\)时的最小值。

但是这个\(O(nP^2)\)的显然不行,发现有一个\(a_i\leq b_i\)的性质考虑怎么使用。

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

一个十分巧妙的\(dp\)是设\(f_{i,j}\)表示\(a_i\)的和\(\leq j\)且\(b_i\)的和\(\geq j\)。虽然这样的限制不完全,但是这样确实可以统计到最小答案且不会统计到更小答案。

转移就是

\[f_{i,j}=min\{f_{i-1,j},f_{i-1,p}+c_i\}(p\in[j-b_i,j-a_i])
\]

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

时间复杂度\(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;
}

最新文章

  1. sql存储过程异常捕获并输出例子还有不输出过程里面判断异常 例子
  2. JAVASCRIPT实现简单计算器
  3. 2、面向对象以及winform的简单运用(面向对象的四大基本特性)
  4. Entity Framework之问题收集
  5. CentOS 关闭蜂鸣
  6. Visualsvn Server的搭建
  7. SWOT分析法
  8. bootloader启动代码init.s解析----IRQ中断处理函数
  9. Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds解
  10. ie8下下拉菜单文字为空
  11. Spring4.14 事务异常 NoUniqueBeanDefinitionException: No qualifying bean of type [....PlatformTransactionManager]
  12. Unity编程标准导引-1.2官方资源介绍
  13. Top 10 Books For Advanced Level Java Developers
  14. Python第八天——Json
  15. OpenGL渲染管线(rendering pipeline)
  16. Scala--控制结构和函数
  17. JS时间轴效果(类似于qq空间时间轴效果)
  18. Java面向接口编程【精品博客】
  19. php if 的实现
  20. 基于Spring的最简单的定时任务实现与配置(三)--番外篇 cron表达式的相关内容

热门文章

  1. bootstrap 冻结表格,冻结表头
  2. 演练:创建和使用自己的动态链接库 (C++)
  3. WPF 窗口 最前端 Topmost Owner
  4. Python中的私有属性私有方法、类属性类方法以及单例设计模式
  5. Python之requests模块-request api
  6. Jenkins 构建JOB失败
  7. 前端搭建Linux云服务器,Nginx配置详解及部署自己项目到服务器上
  8. MySQL——InnoDB事务
  9. python库--pymysql
  10. linux主机安全加固-个人经验