【7.10校内test】T3经营与开发
2024-08-27 08:31:43
它……又是个DP
我……我讨厌DP!?
然后又是读入,显然用快读啊:(数据范围还是很大的)(习惯)
然后我们发现,不论是损耗值维修值,还是采矿所得,维修花费,都带着个p,因此我们可以把p提出来?
dp[i]表示第i个星球~第n个星球的最大赚取费用;
那么我们的解就是dp[1];
考虑一下:
假设第i个是资源型,在之前已经求出dp[i+1](代表从i+1开始选,1~i一概略过)的最大金钱数,那么dp[i]=max(dp[i+1]/*这个不选*/, a[i]+dp[i+1]*(1-0.01*k)/*第i个选了,加上金钱,当前钻头能力系数变为原来的(1-0.01*k),那么后面的得到的最大金钱数也变为原来的(1-0.01*k)*/)
那么如果第i个是资源型也同理,如果我们选了它,那么对后面dp[i+1],会使它的钻头能力变为原来的(1+0.01*c)倍,当然记得减去a[i](把p已经提出来了qwq)
因此核心代码:
if(t[i]==) dp[i]=max(dp[i+],dp[i+]*(-0.01*k)+a[i]);
else dp[i]=max(dp[i+],dp[i+]*(+0.01*c)-a[i]);
最后不要忘记再将w乘回来(因为实际上p的改变都乘在dp数组中了,所以只需要乘原始值)
#include<bits/stdc++.h> using namespace std; inline int read(){
int ans=;
char last=' ',ch=getchar();
while(ch>''||ch<'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=(ans<<)+(ans<<)+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} int n;
double k,c,w;
int x[],type[];
double f[]; int main(){
n=read();
scanf("%lf%lf%lf",&k,&c,&w);
for(int i=;i<=n;i++){
type[i]=read();
x[i]=read();
}
for(int i=n;i>=;i--){
if(type[i]==) f[i]=max(f[i+],f[i+]*(-0.01*k)+x[i]);
else f[i]=max(f[i+],f[i+]*(+0.01*c)-x[i]);
}
printf("%.2lf",f[]*w);
return ;
}
忍不住说某些s*jl
end-
最新文章
- 转载一些Android性能优化建议
- Web调试利器OpenWindow
- node_nibbler:自定义Base32/base64 encode/decode库
- 奇怪吸引子---Rucklidge
- 堡垒机环境-jumpserver部署
- WPF 得到子指定元素方法和得到指定子元素集合方法MvvM得到焦点
- java call sap
- require.js学习笔记(内容属于转载总结)
- 【BZOJ 3172】 [Tjoi2013]单词
- Android实例-TTabControl的使用(XE8+小米2)
- linux搜索jar内容
- C# dynamic关键字的使用方法
- 怎样通过WireShark抓到的包分析出SIP流程图
- Qt 之 入门例程(二)
- 你以为你真的会用编辑器----之Emacs
- CentOS 7 安装serverjre 9
- MYSQL内置MYSQL数据库中你可以得到的信息
- codeforces305A
- inux中ifreq 结构体分析和使用(转)
- ubuntu下TFTP Server 的安装和使用方法