P2317 [HNOI2005]星际贸易

题目描述

输入输出格式

输入格式:

输出格式:

如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y。X表示贸易额,Y表示净利润并且两个数字之间用一个空格隔开。如果不能完成这次星际贸易,那么输出文件output.txt中包含 “Poor Coke!”(不包括引号)。


不知道为什么网上找不到txt的,于是只好copy了洛谷的,侵删。


首先理清一下题目。

这老哥的第一目的是想让自己卖的钱最多,第二目的是在卖的钱最多的基础上把利润搞大一点。

很容易发现,第一目的就是个普通的01背包,而且题目说了有唯一解。

用\(is[i][j]\)存储第\(i\)个星球\(j\)状态时是否由在\(i\)上卖东西得到的,得到必须去的星球。

第二目的就比较坑了,经过仔细的读题,我们发现这个维护是个捆绑销售啊,你只要上去星球了,你就必须得维护。

虽说这样比较无良,但不可置否的,也给我们做题带来了方便啊,我们可以对维护少一些决策。

我们看看这个燃料,虽然他能带的上看起来很多,但实际上也只需要最多4000就够了,我们试试对燃料做个背包。

\(dp[i][j]\)代表在第\(i\)个星球正准备出发(出发的加速还未使用)时,拥有\(j\)燃料的花费最小值。

\(dp[i][j]=min(dp[i][j],dp[k][j+2+cnt]+cnt*p[i]+f[i]),i>k,l[i]-l[k]>=l0\)

转移方程如上,要枚举$i,j,k,cnt$4维,绝对爆了

怎么优化?

对完全背包熟悉的话,也许比较容易就可以优化到\(O(N^3)\)

即\(dp[i][j]=min(dp[i][j-1]+p[i],dp[k][j+2]+f[i]),i>k,l[i]-l[k]>=l0\)

对\(k\)这一维怎么办呢?
我们发现,对于每一次使用,我们其实都找了很多遍\(dp[k][j+2]\)的最小值。

我们为什么不能把之前找到给利用起来呢?

好了,单调队列维护一下。

至此,复杂度就降到了\(O(N^2)\)


code:

#include <cstdio>
#include <cstring>
int min(int x,int y) {return x<y?x:y;}
const int N=2002;
const int inf=0x3f3f3f3f;
int dp[N][(N<<1)+10];
int n,m,r,l0;//点,货物,燃料,距离
int a[N],b[N],l[N],p[N],f[N];//量,钱,距,燃,维修
//此时dp[i][j]代表前i个星球卖j货物时的最大值
int is[N][N];//是否在i星球j状态卖东西
int is_s[N],m_max,m_min;
void s_dp()
{for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){dp[i][j]=dp[i-1][j];if(j>=a[i]&&dp[i][j]<dp[i-1][j-a[i]]+b[i]){dp[i][j]=dp[i-1][j-a[i]]+b[i];is[i][j]=1;}}int j;for(int i=0;i<=m;i++)if(dp[n][i]>m_max){m_max=dp[n][i];j=i;}for(int i=n;i>0;i--){if(is[i][j]){j-=a[i];is_s[i]=1;}}is_s[n]=1;
}
//此时dp[i][j]代表前i个星球装j燃料时正准备出发的费用
int q[(N<<1)+5][N][2],L[N],R[N];//0首1尾
void push(int j,int c,int id){q[j][++R[j]][0]=c;q[j][R[j]][1]=id;}
void front_pop(int j){R[j]--;}
void back_pop(int j){L[j]++;}
bool is_empty(int j) {return L[j]==R[j];}
void p_dp()
{memset(dp,0x3f,sizeof(dp));m=min(N,r);dp[0][m]=0;push(m,0,0);for(int i=1;i<=n;i++)for(int j=0;j<=m;j++){while(!is_empty(j+2)&&l[i]-l[q[j+2][L[j+2]+1][1]]>l0)back_pop(j+2);//超出距离int id1=q[j+2][L[j+2]+1][1];//停的可行性最小值坐标dp[i][j]=min(dp[id1][j+2]+f[i],dp[i][j]);//从前面停if(p[i]&&j)dp[i][j]=min(dp[i][j],dp[i][j-1]+p[i]);//或者买油if(is_s[i])L[j]=R[j]=0;while(!is_empty(j)&&dp[i][j]<=q[j][R[j]][0]) front_pop(j);//更新单队push(j,dp[i][j],i);}m_min=inf;for(int i=0;i<=m;i++)m_min=min(dp[n][i],m_min);
}
int main()
{scanf("%d%d%d%d",&n,&m,&r,&l0);for(int i=1;i<=n;i++)scanf("%d%d%d%d%d",a+i,b+i,l+i,p+i,f+i);for(int i=1;i<=n;i++)if(l[i]-l[i-1]>l0){printf("Poor Coke!\n");return 0;}s_dp();p_dp();if(m_min<inf)printf("%d %d\n",m_max,m_max-m_min);elseprintf("Poor Coke!\n");return 0;
}

事实上要注意几个细节:

  1. 到第一问求得星球上时要清空单队(以前的情况失效了)
  2. 判能不能到不是看他亏不亏。
  3. 写的巧一点可以不用先判一次无解(有的状态拿0转移了)

2018.5.26

转载于:https://www.cnblogs.com/butterflydew/p/9094703.html

洛谷 P2317 [HNOI2005]星际贸易 解题报告相关推荐

  1. 【洛谷】P4147 玉蟾宫 解题报告

    [洛谷]P4147 玉蟾宫 解题报告 题目背景 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 题目描述 这片土地被分成N* ...

  2. 洛谷 P3539 [POI2012]ROZ-Fibonacci Representation 解题报告

    P3539 [POI2012]ROZ-Fibonacci Representation 题意:给一个数,问最少可以用几个斐波那契数加加减减凑出来 多组数据10 数据范围1e17 第一次瞬间yy出做法, ...

  3. 「洛谷P1343」地震逃生 解题报告

    P1343 地震逃生 题目描述 汶川地震发生时,四川XX中学正在上课,一看地震发生,老师们立刻带领x名学生逃跑,整个学校可以抽象地看成一个有向图,图中有n个点,m条边.1号点为教室,n号点为安全地带, ...

  4. 洛谷 P4284 [SHOI2014]概率充电器 解题报告

    P4284 [SHOI2014]概率充电器 题目描述 著名的电子产品品牌SHOI 刚刚发布了引领世界潮流的下一代电子产品-- 概率充电器: "采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  5. 洛谷 [SDOI2015]约数个数和 解题报告

    [SDOI2015]约数个数和 题目描述 设\(d(x)\)为\(x\)的约数个数,给定\(N,M\),求$ \sum\limits^N_{i=1}\sum\limits^M_{j=1}d(ij)$ ...

  6. 洛谷 CF1043F Make It One 解题报告

    CF1043F Make It One 题意 从一堆数中选择最少的数,使它们的\(\gcd=1\) 输入输出格式 输入格式 第一行:一个正整数\(n\). 第二行:\(n\)个正整数,给出了这个数列. ...

  7. 洛谷 P3521 [POI2011]ROT-Tree Rotations 解题报告

    P3521 [POI2011]ROT-Tree Rotations 题意:递归给出给一棵\(n(1≤n≤200000)\)个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少. 大体 ...

  8. 洛谷 P2324 [SCOI2005]骑士精神 解题报告

    P2324 [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,* ...

  9. 洛谷 P2389 电脑班的裁员 解题报告

    题意: 给定一段长为N的序列,选取其中的至多M段使这些子段和最大. 当N=1000时,我们可以采用动态规划解法 令\(dp[i][j][k]\)代表当前选至位置\(i\)处于第\(j\)段当前是否选取 ...

  10. 洛谷 P1129 [ZJOI2007]矩阵游戏 解题报告

    P1129 [ZJOI2007]矩阵游戏 题目描述 小\(Q\)是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏.矩阵游戏在一个\(N*N\)黑白方阵进行(如同国际象棋一般 ...

最新文章

  1. TCP全连接和半连接的问题探讨
  2. python测验9_荐 测验9: Python计算生态纵览 (第9周)
  3. WI-FI无线数据解密
  4. price ceiling
  5. 网页最少要有一个html标签,PHP_网页开发人员必须知道的10个不常用HTML标签, 网页开发人员常常希望能 - phpStudy...
  6. UOJ#419. 【集训队作业2018】圆形(格林公式)
  7. 如何使用粒子氩气进行位置跟踪
  8. 实战操作主机角色转移(二)
  9. MySQL 8.0.12 有什么新内容?
  10. sql server 内存_SQL Server内存性能指标–第5部分–了解惰性写入,空闲列表停顿/秒和待批内存授予
  11. 【数据结构笔记26】根据一棵树的先序/中序遍历Push与Pop内容,输出这棵树的先序、中序、后序遍历数组(不需要真的建立出树)
  12. 大厂Android高级多套面试专题整理集合,大厂直通车!
  13. linux降内核版本_linux内核降级
  14. 腾讯携手中科院国家天文台落地FAST 用云计算探索星辰大海
  15. k8s部署-49-k8s日志采集的解决方案思路梳理
  16. html绘制地铁线路图,地铁线路图怎么画?几个步骤助你轻松作出
  17. hrm项目-day02
  18. Esxi 6.7基于已有数据存储配置虚拟机(Windows类)间共享存储(非RDM)
  19. C语言调试技巧(以vs编译器为例)
  20. 有限元分析的分析流程

热门文章

  1. [转]CSS3 Media Query实现响应布局
  2. UAC在注册表中的对应位置
  3. Win7 启用 Telnet 功能
  4. WCF与AJAX编程开发实践(2):支持ASP.NET AJAX的Web Service
  5. 【SDOI 2009】学校食堂 Dining
  6. EMNLP'21 Findings|字节火山翻译提出:基于自修正编码器的神经机器翻译
  7. 搜索系统中的纠错问题
  8. 天池NLP文本分类比赛如何轻松轻松获得Top K的秘诀!
  9. Map-Reduce
  10. LeetCode刷题——167. 两数之和 II - 输入有序数组