https://www.zybuluo.com/ysner/note/1309789

题面

要素太多,还是自己看吧

解析

如果要求贸易额最大,就相当于:

有\(n\)个物品(星球),每个物品价值为\(v_i\)(每个星球能卖\(v_i\)),现装入一个体积为\(m\)(载重量为\(m\))的背包,最大化装入物品体积之和。

一个裸背包\(DP\)即可解决第一问。

并且我们可以顺手得出,达到该贸易额,必须要停靠哪些站。

(当然,为了维护和加油,应该还需要停靠另外一些站)

接下来要求利润最大,就是要求加油与维修的费用最少。

由于\(n\leq2000\),所以状态只能设两维:

\(f[i][j]\)表示到第\(i\)个星球时油量为\(j\)的最小花费。

相关转移:

加油:直接\(f[i][j-1]->f[i][j]\)即可。

维护:从前面停靠了的站转移过来(枚到最近那个必须停靠的星球就行)。

这样好像是\(O(n^3)\)的。。。

然后膜了一发\(yyb\),发现维护的转移过程可以用单调队列优化(先尾后进后首)。

很有道理啊。

于是就做完了。

复杂度\(O(n^2)\)。

细节问题:\(m,R\)混用、背包转移不全、单调队列入出队条件设错(应该以当前\(DP\)值为参照,而不是队列内)。

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<vector>
#define ll long long
#define re register
#define il inline
#define fp(i,a,b) for(re int i=a;i<=b;++i)
#define fq(i,a,b) for(re int i=a;i>=b;--i)
using namespace std;
const int N=2500;
int n,m,V,len,A[N],B[N],L[N],P[N],F[N],dp[N][N<<1],pos,ans1,ans2,Q[N<<1][N],h[N<<1],t[N<<1];
bool vis[N];
il int gi()
{
re int x=0,t=1;
re char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') t=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*t;
}
il int max(re int x,re int y){return x>y?x:y;}
il int min(re int x,re int y){return x<y?x:y;}
int main()
{
n=gi();m=gi();V=min(gi(),2*n);len=gi();
fp(i,1,n)
{
A[i]=gi();B[i]=gi();L[i]=gi();P[i]=gi();F[i]=gi();
if(L[i]-L[i-1]>len) return puts("Poor Coke!"),0;
}
memset(dp,-63,sizeof(dp));dp[0][0]=0;
fp(i,1,n)
fp(j,0,m)
{
if(j>=A[i]) dp[i][j]=max(dp[i][j],dp[i-1][j-A[i]]+B[i]);
dp[i][j]=max(dp[i][j],dp[i-1][j]);
}
fp(i,1,m) if(dp[n][pos]<dp[n][i]) pos=i;
ans1=dp[n][pos];
fq(i,n,1) if(dp[i][pos]!=dp[i-1][pos]) vis[i]=1,pos-=A[i];
memset(dp,63,sizeof(dp));dp[0][V]=0;Q[V][t[V]++]=0;
fp(i,1,n)
fp(j,0,V)
{
if(P[i]&&j) dp[i][j]=min(dp[i][j],dp[i][j-1]+P[i]);
if(h[j+2]<t[j+2]) dp[i][j]=min(dp[i][j],dp[Q[j+2][h[j+2]]][j+2]+F[i]);
if(vis[i]) h[j]=t[j]=0;//can't avoid
while(h[j]<t[j]&&dp[Q[j][t[j]-1]][j]>=dp[i][j]) --t[j];
Q[j][t[j]++]=i;
while(h[j]<t[j]&&L[i+1]-L[Q[j][h[j]]]>len) ++h[j];
}
pos=0;
fp(i,1,V) if(dp[n][i]<dp[n][pos]) pos=i;
ans2=dp[n][pos];
if(ans2>1e9) return puts("Poor Coke!"),0;
printf("%d %d\n",ans1,ans1-ans2);
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. [luogu2317 HNOI2005] 星际贸易 (dp)

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

  5. 【简●解】[HNOI2005]星际贸易

    [大意] 太多了,懒得打,贴\(LG\)的图了... [分析] 开始拿到这道题有点慌:怎么限制条件这么多,再读读题. 注意一个东西,就是贸易额与费用是独立分开的,并且题目保证只有一种方案获得最大贸易额 ...

  6. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  7. cyyz: Day 4 网络流整理

    Day 4 网络流的理论性知识(算了..我自己都看不下去,还是整理些例题以后复习用吧qaq): 一.PPT(主要内容)   二.搜自度娘 定义: 年,L.R. 福特和 D.R. 富尔克森等人给出了解决 ...

  8. 51nod1773 A国的贸易

    基准时间限制:2 秒 空间限制:524288 KB 分值: 40  A国是一个神奇的国家. 这个国家有 2n 个城市,每个城市都有一个独一无二的编号 ,编号范围为0~2n-1. A国的神奇体现在,他们 ...

  9. BZOJ 1927: [Sdoi2010]星际竞速

    1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 2051  Solved: 1263[Submit][Stat ...

随机推荐

  1. CentOS7安装Tomcat9并设置开机启动

    1.下载 Tomcat 9 CentOS 7 下创建目录并下载文件: cd /usr/local/ mkdir tomcat cd tomcat wget http://mirrors.hust.ed ...

  2. linux虚拟环境搭建

    一.virtualenv的安装与使用 1.安装virtualenv pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple virtualen ...

  3. 集训第四周(高效算法设计)D题 (区间覆盖问题)

    原题 UVA10020  :http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19688 经典的贪心问题,区间上贪心当然是右区间越 ...

  4. 一个简单的模板了解css+div网页布局

    直接附上最终效果图: index.html内容: <html> <!--20170730 soulsjie--> <head> <meta http-equi ...

  5. MT6753 使用nt35596s 由于液晶极化出现的闪屏问题解决思路

    咨询屏厂那边FAE , 若是液晶极化相关的问题,下面三种场景下比较容易复现现象,请协助在目前的故障机上做压力测试: 1.反复开关机(1000次), 2.按power键休眠和唤醒(1000次), 3.反 ...

  6. 【NOIP2017练习】跳跃切除子序列(模拟)

    题意: 思路: 已放弃 #include <bits/stdc++.h> typedef long long LL; int main(){ int T; scanf("%d&q ...

  7. CF676E:The Last Fight Between Human and AI

    人类和电脑在一个多项式上进行博弈,多项式的最高次项已知,一开始系数都不确定.电脑先开始操作,每次操作可以确定某次项的系数,这个系数可以是任意实数.给出一个博弈中间状态,最后如果这个多项式被x-K整除就 ...

  8. js格式化日期时间

    // 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).周(E).小时(h).分(m).秒(s).季度(q) 可以用 1-2 个占位符, // 年(y)可以用 1 ...

  9. Add Two Numbers(链表)

    You are given two linked lists representing two non-negative numbers. The digits are stored in rever ...

  10. JSP国际化设置

    以下内容引用自http://wiki.jikexueyuan.com/project/jsp/internationalization.html: 国际化(i18n):这意味着可以使网站根据访问者的语 ...