2017.10.26 星际贸易 思考记录
这个题非常繁琐,而且网上的题解非常不详细。。
首先第一问
由于所有的点都要走到,所以就是01背包
需要可持久化背包来输出方案。。类似floyd的判断方式
然后这些选定的点都一定是要维护的,
第二问就是枚举每个点+每个点的加速器数量 来 dp
然后n^4的dp就是从1到n枚举i,从1到i枚举j,从0到r枚举j的加速器个数k ,从0到r枚举i的加速器个数l,然后转移
然后可以优化 ,由于对于 枚举的每一个j 当k相同的时候只从j中选最优的更新 ,只要 求i对于每个k的前面的最优值即可,可以证明这是贪心取,(只要合法,就去花费最小的)
然后就顺带出一个类似飞扬的小鸟的更新方法,同级更新,一直选择最优的往上买,,
对于买加速器的情况就变成O(1)的顺带转移了
码:
#include<iostream>
#include<cstdio>
using namespace std;
int n,m,r,l0,k,v[4002],ans1,ans2=1000000009,c[4002],l[4002],p[4002],wh[4002],i,j,f[4003][4003],q[5003][5003],z1[5003],z2[5003];
bool bj[4002];
int main()
{scanf("%d%d%d%d",&n,&m,&r,&l0);r=min(r,n*2);for(i=1;i<=n;i++){scanf("%d%d%d%d%d",&c[i],&v[i],&l[i],&p[i],&wh[i]); }for(i=1;i<=m;i++)for(j=1;j<=n;j++)f[j][i]=-1000000009;f[0][0]=0;for(j=1;j<=n;j++){for(i=m;i>=0;i--){f[j][i]=f[j-1][i];if(i>m-c[j])continue;if(f[j][i+c[j]]<f[j-1][i]+v[j]){f[j][i+c[j]]=f[j-1][i]+v[j]; if(f[j][i+c[j]]>ans1){ans1=f[j][i+c[j]];ans2=i+c[j];}} } }int lin=ans1,lin2=ans2;
if(lin2<1000000009) for(i=n;i>=1;i--){if(lin2-c[i]>=0&&f[i-1][lin2-c[i]]+v[i]==lin){bj[i]=1; lin=f[i-1][lin2-c[i]];lin2=lin2-c[i];} }//ans1=f[ans1][0];for(i=0;i<=n;i++)for(j=0;j<=r+2;j++)f[i][j]=1000000009,z2[j]=-1;ans2=1000000009;f[0][r]=0;q[r][++z2[r]]=0;for(i=1;i<=n;i++){for(j=2;j<=r+2;j++)//枚举上一个更新这一个 {if(j!=2&&p[i]>0)f[i][j-2]=f[i][j-3]+p[i];while(z1[j]<=z2[j]&&(l[i]-l[q[j][z1[j]]]>l0))z1[j]++;if(j<=r){int l1=l[i]-l[q[j][z1[j]]];if(l0>=l1)if(f[i][j-2]>f[q[j][z1[j]]][j]) f[i][j-2]=f[q[j][z1[j]]][j]; }while(z1[j-2]<=z2[j-2]&&l[i]-l[q[j-2][z1[j-2]]]>l0)z1[j-2]++;if(bj[i])while(z2[j-2]>=z1[j-2])z1[j-2]++;while(z1[j-2]<=z2[j-2]&&f[i][j-2]+wh[i]<f[q[j-2][z2[j-2]]][j-2])z2[j-2]--;q[j-2][++z2[j-2]]=i;}for(j=0;j<=r;j++)f[i][j]+=wh[i]; }for(i=0;i<=r;i++)if(f[n][i]<ans2)ans2=f[n][i];if(ans2<1000000009)printf("%d %d",ans1,ans1-ans2); else printf("Poor Coke!");
}
2017.10.26 星际贸易 思考记录相关推荐
- 2017.10.29 染色方案 思考记录
这个题数据特别小,于是想到状压多维之流. 状压是比较麻烦的,虽然也能写,但多维dp明显要好写一些 根据15去设计状态是没有前途的,因为按颜色分一定会MLE 这时就考虑根据5分,这样不同颜色就离散了,就 ...
- 2017.10.24 上升序列 思考记录
终于有会做的题了... 一开始想用正常的lis ,然后从前往后扫, 由于最优查询区间在序列上是按顺序单调递增的,所以想记录每个点取哪个值跳到哪,这样是n*m logn的 然后发现既然是单调递增的那直接 ...
- 2017.10.9 放棋子 思考记录
.这个题根本没想到错排,但它似乎离散为斜对角之后很有规律,于是打表,推出了式子... 经常手玩式子,前几天的测试根本没想到卡特兰数然后用组合数硬生生凑了出来,然后这个题的错排.. f表示答案 g表示 ...
- 2017.10.7 括号序列 思考记录
这个题看起来很简单,但细节比较麻烦.参考完别人的代码后才想出自己的解法的.. 一开始认为已匹配的括号是可以直接消的,所以就只维护了两个变量 但还有区间取反.. 由于和已配对的括号的顺序有关,所以不是很 ...
- 2017.10.30 覆盖问题 思考记录
从细节入手已经从一种技巧变成一种策略了. 题目给出的条件很奇怪,是3个正方形,, 为什么是3个而不是4个或2个呢.. 于是先用一个大矩形把所有点卡住 然后显然矩形的每个边 都有一个正方形和他在一条直线 ...
- 2017.10.29 软件安装 思考记录
这个题一开始卡了,,就是树内的必选和可选分不太清 ,其实很好分,对于一个子树,根是必选,子节点是可选 然后递归保证正确性 可选就是把每个花费都看成一个物品往里背包 注: 1.必选<c[o]的要清 ...
- 2017.10.25 打鼹鼠 思考记录
挺直白的dp 离散的是移动的过程,因为经过一番移动一定是为了出现在某个地点 所以直接m^2枚举,类似lis的转移即可 码: #include<iostream> #include<c ...
- 2017.10.19 大陆争霸 思考记录
一上来想到拓扑分层最短路,但需要多源最短路.. 这题考查的是对dij的理解 dij只能跑最短路每次都找极值点进行一次拓展,同时不能有负边权 所以一次需要确定 两个值都确定的一个点所以扩展的条件有两个 ...
- 2017.10.17 蜘蛛难题 思考记录
强烈建议不要做此题,此题描述差到极点!毒瘤出题人 首先有想法就是从起点往后按照出水管依次满足,但多个水域需要合起来求下一个最低出水口,所以并不是很好维护 所以最好按照时间模拟 先求出当前状态下的最低水 ...
最新文章
- 图解Transformer,读完这篇就够了
- JavaScript基础,Cookies,Sessions
- Android下PopupWindow隐藏及显示(showAtLocation/showAsDropDown)
- zlib和openssl相关库错误的解决
- iOS开发——高级技术地图功能的实现
- sql backup database备份d盘_Oracle RMAN备份与恢复
- SpringBoot笔记:SpringBoot集成MinIO分布式文件系统
- Android SDK Manager 加载不出tools解决办法
- 华为怎么安装服务器系统版本,服务器怎么安装操作系统版本
- css中em与px的介绍及换算方法
- “加薪”、“洗手间”都不能提?亚马逊内部员工通讯 App 曝光
- git常用命令(史上最经典)
- 一点创业想法:读书类垂直博客
- springboot异步任务
- Roboware (ROS IDE)字体设置
- 云计算学习笔记3——分布式通信
- 发布下今天学习内容--CentOS7安装Oracle 11gR2 图文详解
- 如何用Python写一个上课点名系统
- mui赋值_mui input用法
- failed to push some refs to 'https://e.coding.net/xxx/xxx.git fetch = +refs/heads/*:refs/
热门文章
- 关于Word2016敲入公式的新方法
- 计算不定方程解的个数的方法汇总
- MATLAB AppDesigner 设计UI界面中调用自定义函数
- android studio 横幅,有关 android studio notification 横幅弹出的功能没有反应
- is not a function_libcxx 的 std::function 源码分析
- 数组的内存理解(图示)
- 【爬虫】毕设学习记录:python爬取静态网页(只爬取单页)
- python列表赋值 连续整数_Python_03_字符串_数据类型_for循环_列表操作
- python的表达式范围怎么写_python表达式
- stm32 薄膜键盘原理_铅锤哥:市面上的笔记本键盘优缺点解析,看完秒懂