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. 精帖转载(关于stock problem)

    Note: this is a repost(重新投寄) of my original post here with updated solutions(解决方案) for this problem ...

  2. [bzoj1208][HNOI2004][宠物收养所] (平衡树)

    Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特 ...

  3. 圆角计算 Shader

    圆角的计算 在Shader中,我们使用UV坐标来计算需要显示的部分和不需要显示的部分,使用透明来处理显示与不显示.UV坐标如下图1,我们将坐标平移到图2位置,面片的UV坐标原点在面片中心,UV坐标范围 ...

  4. CodeForcesGym 100517H Hentium Scheduling

    Hentium Scheduling Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForc ...

  5. [luoguP1489] 猫狗大战(DP)

    传送门 类似背包的做法. f[i][j]表示是否能放i个物品,价格为j #include <cstdio> #include <iostream> #define N 8001 ...

  6. 子集和的目标值(codevs 1692)

    题目描述 Description 给定n个整数in和目标值T,求某一非空子集使 子集的元素的和 与 目标值之差 的绝对值最小,元素可重复 输入描述 Input Description 第一行为整数n ...

  7. PHP PDO使用

    PHP操作MySQL数据库方式有三种: *1. mysql 最原始的.纯过程化的 如连接: mysql_connect(主机名,账号,密码); 2. mysqli 改进版的.兼容过程化和面向对象化操作 ...

  8. HDU——1150 Machine Schedule

    Machine Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  9. Ubuntu 16.04使用sudo apt-get -f install解决依赖时的注意事项(重点)

    注意:在觉得软件依赖时,一般使用sudo apt-get -f install,但是也是非常危险的,尤其时一些软件需要删除某些依赖时,会导致原有安装的软件全部卸载.所以使用此命令时要时刻注意输出的这条 ...

  10. MongoDB小结05 - update【$set & $unset】

    用$set指定一个键的值,如果不存在,就创建它.这对更新模式或者增加用户定义很有帮助. db.user.insert({"name":"codingwhy.com&quo ...