挖煤
挖煤(coal)
【问题描述】
众所周知,小C 是挖煤好手。
今天他带着他的魔法镐子去挖煤,他的镐子一开始有𝑤点魔
力。他的挖煤路线上会依次经过𝑛个地点,每个地点是煤矿或者
补给站,设小 C 当前镐子魔力值为𝑝,第𝑖个地点如果是煤矿,他
可以开采,获得�𝑖 · 𝑝的金钱,但镐子的魔力值减少𝑘%;如果是
补给站,他可以花�𝑖 · 𝑝的金钱令镐子的魔力值增加�%。每个地
点可以进行至多一次操作。
小C 想知道他的最大收益。
【输入格式】
第一行4 个整数𝑛, 𝑘, �,𝑤。
接下来𝑛行,每行两个整数𝑡𝑦𝑝𝑒𝑖 , �𝑖,若𝑡𝑦𝑝𝑒𝑖 = 1,𝑖号地点
为煤矿;若𝑡𝑦𝑝𝑒𝑖 = 2,𝑖号地点为补给站。
【输出格式】
输出一个实数,表示答案,保留2 位小数。
【样例输入】
5 50 50 10 1 10
1 20
2 10
2 20
1 30
【样例输出】
375.00
【数据范围】
对于30%的数据,𝑛 ≤ 100。
另有20%的数据,𝑛 ≤ 1000, 𝑘 = 100。
对于100%的数据,𝑛 ≤ 105,0 ≤ 𝑘, c,𝑤,a_𝑖 ≤ 100,保证答案
不超过10^9。
一看这题目,其实我感觉不太像dp因为状态不好搞,有一个是小数的状态是镐子
但是仔细思考一下,可以发现这个状态其实可以和贡献整合在一起,因为我们高兴的发现,所有和镐子状态有关的贡献都与a[i]有关而且都仅仅是与贡献有关,所以就可以高兴的做dp了。
正着dp还是有后效性无法处理,那我们正难则反,考虑倒着做dp
对于一个地方的煤炭,我们可以挖也可以不挖
如果挖的话,那么对于后面的地方所有获得的贡献就是要乘上这一次减少的p在加上贡献
对于维修站也是同理
f[i]表示从i开始走的最大收益
f[i]=max(f[i+1],f[i+1]*(1-k%)+a[i])
没了
巨简单
#include<bits/stdc++.h> #define ll long long using namespace std; double f[1000001];//f[]i¡À¨ª¨º?¡ä¨®i?a¨º?¦Ì?¡Á?¡ä¨®¨º?¨°? double k,c,w,ans;int n,a[1000001],type[100001]; inline ll read() { char c=getchar();ll a=0,b=1; for(;c<'0'||c>'9';c=getchar())if(c=='-')b=-1; for(;c>='0'&&c<='9';c=getchar())a=a*10+c-48; return a*b; } int main() { // freopen("T2.in","r",stdin); freopen("coal.in","r",stdin); freopen("coal.out","w",stdout); n=read();k=(100-read())/100.0;c=(100+read())/100.0;w=read(); for(int i=1;i<=n;i++) { type[i]=read(); a[i]=read(); } f[n+1]=0; for(int i=n;i>0;i--) { if(type[i]==1) { f[i]=max(f[i+1],f[i+1]*k+a[i]); } else { f[i]=max(f[i+1],f[i+1]*c-a[i]); } } printf("%.2lf\n",f[1]*w); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】