挖煤

【问题描述】
众所周知, 小C是挖煤好手。
今天他带着他的魔法镐子去挖煤 ,他的镐子一开始有$w$点魔力。他的挖煤 路线 上会依次 经过$n$个地点, 地点, 每个 地点是煤矿或者补给站,设小C当前镐子魔力值 为$p$,第$i$个地点如果是煤矿,他可以开采,开采,获得 $a_i*p$的金钱,但镐子的魔力值魔力值减少$k%$;如果是补给站,他可以花$a_i*p$的金钱令镐子的魔力值增加$c%$。每个地 点可以进行至多一次操作。
小C想知道他的最大收益。
【输入格式】

第一行 4个整数 $n,k,c,w$。
接下来$n$行, 每行 两个 整数$t_i,a_i$,若$t_i=1$,$i$号地点为煤矿;若$t_i=2$,$i$号地点为补给站

【输出格式】

输出 一个 实数, 实数, 表示 答案, 保留 2位小数。

恩,DP好题,难度不大,但是想法比较好。

分析:

对于一个煤矿,如果我们挖了那么之后的的收益就要乘上$(1-k%)$。那么,如果我们能先知道之后的收益为多少,然后再来考虑这个位置挖还是不挖就很容易了。

设$f[i]$表示从$i$开始的最大收益,转移:$f[i]=max(f[i+1],f[i+1]*(1-k%)+a[i])$。补给站的转移类似。

这题考虑了从后向前DP,和自己之前写过的DP都不太一样,考场上想了半天正着做,$n^3$的DP都打炸了,直接心态崩掉。

DP题还是多写点好。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define N 100005
using namespace std;
int n,k,c,w,t[N],a[N];
double f[N],ans;
int main(){
scanf("%d%d%d%d",&n,&k,&c,&w);
for(int i=1;i<=n;i++) scanf("%d%d",&t[i],&a[i]);
f[n+1]=0;
for(int i=n;i;i--){
if(t[i]==1) f[i]=max(f[i+1],f[i+1]*(1-1.0*k/100.0)+1.0*a[i]);
else f[i]=max(f[i+1],f[i+1]*(1+1.0*c/100.0)-1.0*a[i]);
ans=max(ans,f[i]*w);
}
printf("%.2lf\n",ans);
return 0;
}

最新文章

  1. atitit.细节决定成败的适合情形与缺点
  2. swing中JTable的使用方法
  3. Java初学随笔
  4. React JS快速入门教程
  5. js添加确认删除操作注意事项
  6. LevelDB源码之四LOG文件
  7. MySQL之连接数据库的两种方法
  8. java 泛型学习
  9. 3_Guess Fingers
  10. Java开发岗位面试题
  11. C#2.0--集合--转载车老师
  12. java系统参数
  13. 网站SEO,HTTP请求的关键数字----6
  14. python 之分发包
  15. 【bzoj 2326】【HNOI 2011】数学作业
  16. c/c++再学习:C与Python相互调用
  17. Tsinghua 2018 DSA PA2简要题解
  18. python del关键字的用法
  19. jenkins+git+maven 增量部署思路以及相关脚本
  20. 在Linux安装和使用LinuxBrew

热门文章

  1. ThreadLocal部分源码分析
  2. 异常大讨论-抛出异常还是返回false
  3. AIApe问答机器人Scrum Meeting 4.23
  4. Linux基础是零基础必须要过的关,你懂了多少
  5. 单源最短路径算法:迪杰斯特拉 (Dijkstra) 算法(一)
  6. js实现日期格式化封装-八种格式
  7. HTML bootstrap 模态对话框添加用户
  8. 关于Asp.net core配置信息读取的源码分析梳理
  9. 【接口】SpringBoot+接口开发(一)
  10. OSI模型 &amp; TCP/IP模型