正题

题目链接: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;
}

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

  1. 牛客挑战赛30 小G砍树 树形dp

    小G砍树 dfs两次, dp出每个点作为最后一个点的方案数. #include<bits/stdc++.h> #define LL long long #define fi first # ...

  2. 牛客练习赛51 C 勾股定理 (数学,结论)

    链接:https://ac.nowcoder.com/acm/contest/1083/C来源:牛客网 题目描述 给出直角三角形其中一条边的长度n,你的任务是构造剩下的两条边,使这三条边能构成一个直角 ...

  3. 牛客练习赛42D(性质、数学)

    题目传送 就像题解所说的,写几个可以发现有分成四段的性质:第一段是从n开始往下贪,第二段是个数字,第三段……卧槽好吧真难描述. 然后发现这个数据量可达1e9,所以考虑“二分确定序列+数学计算”的方式解 ...

  4. 牛客练习赛$48E$ 小$w$的矩阵前$k$大元素 堆

    正解:堆 解题报告: 传送门$QwQ$ 考虑把$b$从大往小排序,然后把$a_1+b_1,a_2+b_1,...,a_n+b_1$丢到堆里,顺便记录下$b$的下标 然后每次拿出一个最大值,设为$mx= ...

  5. 牛客挑战赛30-T3 小G砍树

    link 题目大意: n个节点的带标号无根树.每次选择一个度数为1的节点并将它从树上移除.问总共有多少种不同的方式能将这棵树删到只剩 1 个点.两种方式不同当且仅当至少有一步被删除的节点不同. 题解: ...

  6. 2019 牛客暑期多校 G subsequence 1 (dp+组合数)

    题目:https://ac.nowcoder.com/acm/contest/885/G 题意:给你两个串,要求上面哪个串的子序列的值大于下面这个串的值的序列个数,不含前导零 思路:我们很容易就可以看 ...

  7. 牛客小白月赛1 G あなたの蛙は旅⽴っています【DP】

    题目链接 https://www.nowcoder.com/acm/contest/85/G 思路 按照题解上的方式 存取数据 然后DP一下 就可以了 AC代码 #include <cstdio ...

  8. 2019牛客多校第六场J-Upgrading Technology(枚举+单调队列)

    Upgrading Technology 题目传送门 解题思路 对于这题,我们可以枚举一个k从0~m,表示当前我们把所有技能最少升到了k级,且至少有一个为k级. 此时我们刚好获得了前k个d[]的收益, ...

  9. 牛客练习赛48 C 小w的糖果 (数学,多项式,差分)

    牛客练习赛48 C 小w的糖果 (数学,多项式) 链接:https://ac.nowcoder.com/acm/contest/923/C来源:牛客网 题目描述 小w和他的两位队友teito.toki ...

  10. 牛客练习赛48 A· 小w的a+b问题 (贪心,构造,二进制)

    牛客练习赛48 A· 小w的a+b问题 链接:https://ac.nowcoder.com/acm/contest/923/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C ...

随机推荐

  1. cad转换成png,svg

    1.设置仓库可以在setting.xml中设置(也可以在pom中设置,设置项即可) <mirror> <id>AsposeJavaAPI</id> <name ...

  2. 【spring 注解驱动开发】扩展原理

    尚学堂spring 注解驱动开发学习笔记之 - 扩展原理 扩展原理 1.扩展原理-BeanFactoryPostProcessor BeanFactoryPostProcessor * 扩展原理: * ...

  3. commandBinding 的命令

    <Window x:Class="WpfApplication1.Window29" xmlns="http://schemas.microsoft.com/win ...

  4. C#中的信号量---Semaphore

    emaphore是System.Threading下的类,限制可同时访问某一资源或资源池的线程数. 常用构造方法 https://msdn.microsoft.com/zh-cn/library/e1 ...

  5. uwp 之多媒体开发

    xml code ----------------------------------------------------- <Page x:Class="MyApp.MainPage ...

  6. QT 中的模态和非模态对话框

    void MainWindow::on_pushButton_clicked() { //模态 QDialog dlg(this); dlg.resize(100,100); dlg.exec(); ...

  7. 再也不用担心了,微软官方系统(win10为例)U盘安装教程

    参考文章地址 使用微软官方工具安装纯净版操作系统. 一.准备工作 检查电脑规格是否支持安装(主要看看系统配置是否满足系统运行的最低要求) 一台联网电脑(不一定非是要装系统的那台): 一个≥8G 空间的 ...

  8. Python的GPU编程实例——近邻表计算

    技术背景 GPU加速是现代工业各种场景中非常常用的一种技术,这得益于GPU计算的高度并行化.在Python中存在有多种GPU并行优化的解决方案,包括之前的博客中提到的cupy.pycuda和numba ...

  9. Windows下Rancher复制Pod内文件到本地

    Rancher 未提供直接获取 Pod 内文件的工具(如果有请评论告知下,蟹蟹),但提供了 Rancher 的 CLI 客户端,通过 CLI 可以调用 k8s 的 CLI (kubectl) 命令来操 ...

  10. 记一次《C语言踩内存》问题定位有感

    踩内存问题,个人认为算是比较容易出现但是有很难定位的问题,被踩者轻者功能瘫痪,重者一命呜呼,直接诱发死机.产生踩内存的的原因也比较多样,比较典型的有如下几种: 数组越界访问 字符串越界操作 直接操作野 ...