【大意】

太多了,懒得打,贴\(LG\)的图了。。。

【分析】

开始拿到这道题有点慌:怎么限制条件这么多,再读读题。

注意一个东西,就是贸易额与费用是独立分开的,并且题目保证只有一种方案获得最大贸易额。

所以我们\(dp\)也可以分开\(dp\)。

对于贸易额,每走到一个星球,我可以选择卖或不卖,经典的背包问题,直接\(f[i][j]=min\{f[i-1][j-A_i]+B_i\}\)。

然后从后往前扫记录决策点的转移,这些星球是必到的,即必定会在该星球上维修。

现在来看费用。

设\(g[i][j]\)表示到第\(i\)个星球,剩余反物质燃料为\(j\)的最小费用,暴力枚举转移点,则有\(g[i][j]=\{g[k][l]+(j-l+2)\times P_i+T_i\}(0\le k<i,L_i-L_k\le L_0,l\le j)\)

\(O(n^4)\)转移。。。

然后可推出一个更优的式子:\(g[i][j]=min\{g[k][j+2]+F_i,g[i][j-1]+P_i\}\)。

\(O(n^3)\)转移。。。

然后,,,我就嫖题解了。。。。

噢,原来可以单调队列优化啊,对于每个\(j\)开一个单调队列,若当前的\(i\)为必到的星球,就清空队列中所有的元素,然后把\(i\)放进去。

\(O(n^2)\)转移!!!

【Code】

#include <queue>
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define Re register
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXR = 4000 + 5;
const int N = 2000 + 5;
const int M = 2000 + 5;
inline int read(){
int f = 1, x = 0; char ch;
do { ch = getchar(); if (ch == '-') f = -1; } while (ch < '0' || ch > '9');
do {x = (x << 3) + (x << 1) + ch - '0'; ch = getchar(); } while (ch >= '0' && ch <= '9');
return f * x;
}
int n, m, r, L0, maxm, maxr, A[N], B[N], L[N], P[N], F[N], f[N][M], g[N][M], vis[N];
deque <int> Q[MAXR];
int main(){
n = read(), m = read(), r = read(), L0 = read();
if (r > (n << 1)) r = (n << 1);
for (int i = 1;i <= n; ++i) {
A[i] = read(), B[i] = read(), L[i] = read(), P[i] = read(), F[i] = read();
if (L[i] - L[i - 1] > L0) {
puts("Poor Coke!");
return 0;
}
}
memset(f, 128, sizeof f);
f[0][0] = 0;
for (int i = 1;i <= n; ++i) {
for (int j = 0;j <= m; ++j) {
if (f[i - 1][j] >= 0) f[i][j] = f[i - 1][j];
if (j >= A[i]) {
if (f[i][j] < f[i - 1][j - A[i]] + B[i]) {
f[i][j] = f[i - 1][j - A[i]] + B[i];
}
}
}
} for (int i = 1;i <= m; ++i) if (f[n][i] > f[n][maxm]) maxm = i; for (int i = n, val = maxm;i >= 1; --i) {
if (val - A[i] >= 0 && f[i][val] == f[i - 1][val - A[i]] + B[i]){
vis[i] = 1;
val -= A[i];
}
} memset(g, 0x3f, sizeof g);
g[0][r] = 0;
Q[r].push_back(0);
for (int i = 1;i <= n; ++i) {
for (int j = 0;j <= r; ++j) {
if (P[i] > 0 && j > 0) {
g[i][j] = min(g[i][j], g[i][j - 1] + P[i]);
} while (!Q[j].empty() && L[i + 1] - L[Q[j].front()] > L0) Q[j].pop_front(); if (!Q[j + 2].empty()) {
g[i][j] = min(g[i][j], g[Q[j + 2].front()][j + 2] + F[i]);
} if (vis[i]) Q[j].clear(); while (!Q[j].empty() && g[Q[j].back()][j] >= g[i][j]) Q[j].pop_back(); Q[j].push_back(i);
}
}
for (int i = 1;i <= r; ++i) if (g[n][i] < g[n][maxr]) maxr = i; if (g[n][maxr] == INF) printf("Poor Coke!\n");
else printf("%d %d\n", f[n][maxm], f[n][maxm] - g[n][maxr]); return 0;
}

【简●解】[HNOI2005]星际贸易的更多相关文章

  1. 洛谷 P2317 [HNOI2005]星际贸易 解题报告

    P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...

  2. 【BZOJ1205】[HNOI2005]星际贸易(动态规划)

    [BZOJ1205][HNOI2005]星际贸易(动态规划) 题面 BZOJ 洛谷 题解 第一问就是一个裸\(dp\),因为什么都不用考虑... 所以设\(f[i][j]\)表示当前停靠在第\(i\) ...

  3. bzoj1205: [HNOI2005]星际贸易

    题目链接 bzoj1205: [HNOI2005]星际贸易 题解 辣鸡题面,毁我青春 辣鸡题面,毁我青 辣鸡题面,毁我 辣鸡题面,毁 第一问,背包dp 第二问 问题转化为在一个序列上经过好多点走到终点 ...

  4. [HNOI2005]星际贸易

    https://www.zybuluo.com/ysner/note/1309789 题面 要素太多,还是自己看吧 解析 如果要求贸易额最大,就相当于: 有\(n\)个物品(星球),每个物品价值为\( ...

  5. [luogu2317 HNOI2005] 星际贸易 (dp)

    传送门 Solution 两个dp分开处理, 第一问什么都不考虑直接dp 第二问还有些疑惑,姑且先留坑 Code //By Menteur_Hxy #include <cstdio> #i ...

  6. python ConfigParser、shutil、subprocess、ElementTree模块简解

    ConfigParser 模块 一.ConfigParser简介ConfigParser 是用来读取配置文件的包.配置文件的格式如下:中括号“[ ]”内包含的为section.section 下面为类 ...

  7. AC题目简解-数据结构

    A - Japan  POJ 3067 要两条路有交叉,(x1,y1)(x2,y2)那么需要满足:(x1-x2)*(y1-y2)<0判断出这是求逆序的问题 树状数组求逆序,先通过自定义的比较器实 ...

  8. UE4 RHI与Render模块简解

    UE4中的RHI指的是Render hardware interface,作用像Ogre里的RenderSystem,针对Dx11,Dx12,Opengl等等平台抽象出相同的接口,我们能方便能使用相同 ...

  9. zabbix基本监控各指标简解

    监控项目及使用模板 监控http和https: Template App HTTP Service     Template App HTTPS Service 监控cpu,内存,网络等: Templ ...

随机推荐

  1. shell脚本编程基础知识点

    整数比较: -eq:测试两个整数是否相等:相等为真,不等为假 -ne:测试两个整数是否不等:不等为真,相等为假 -gt:测试一个数是否大于另一个数:大于为真,否则为假 -lt:测试一个数是否小于另一个 ...

  2. linux常用命名汇总:自用,持续更新

    1.查看磁盘空间大小 df -hl 查看磁盘剩余空间 df -h 查看每个根路径的分区大小 du -sh [目录名] 返回该目录的大小 du -sm [文件夹] 返回该文件夹总M数 du -h [目录 ...

  3. Linux 把进程为D(不可中断进程)转换成其他状态

    问题现象:当前集群跑hadoop的时候,,任务失败,但是跑任务的容器没有正常退出,显示一大堆的YarcChild进程,,more /proc/进程/status   查看其状态,进程为D(disk s ...

  4. csp退役前的做题计划1(真)

    csp退役前的做题计划1(真) 因为我太菜了,所以在第一次月考就会退役,还是记录一下每天做了什么题目吧. 任务计划 [ ] Z算法(Z Algorithm) 9.28 [x] ARC061C たくさん ...

  5. ubuntu之路——day16 只用python的numpy在底层检验神经网络的优化算法

    首先感谢这位博主整理的Andrew Ng的deeplearning.ai的相关作业:https://blog.csdn.net/u013733326/article/details/79827273 ...

  6. 反向传播BP算法

    前向传播模型 一般我们使用的公式是: \[ a=\frac{1}{1+\exp \left(-\left(w^{T} x+b\right)\right)} = \frac{1}{1+\exp \lef ...

  7. 第06组 Alpha冲刺(2/4)

    队名:福大帮 组长博客链接:https://www.cnblogs.com/mhq-mhq/p/11885037.html 作业博客 :https://edu.cnblogs.com/campus/f ...

  8. Empirical Analysis of Beam Search Performance Degradation in Neural Sequence Models

    Empirical Analysis of Beam Search Performance Degradation in Neural Sequence Models  2019-06-13 10:2 ...

  9. 机动车驾驶(1)--- 禁令标志汇总 by John

    以下是普通标志牌(新车安全)

  10. 使用 Fiddler 代理调试本地手机页面

    文件下载:http://files.cnblogs.com/files/dtdxrk/fiddler4_4.6.2.0_setup.rar 从事前端开发的同学一定对 Fiddler 不陌生,它是一个非 ...