[题解][洛谷P1412] 经营与开发
题目描述
给定n,k,c,w,然后输入n组数据,数据分为两种:
- 1 ai:可以选择获得aiw的价值,但w会变成w(1-0.01*k)
- 2 bi:可以选择损失biw的价值,但w会变成w(1+0.01*c)
求可获得的最大价值是多少。
题解
看到这个题,我的第一思路是求后缀和,然后让新得到的系数乘后缀和判断是否进行操作。
但问题在于,对于后缀和,我们并不会一定每一个数据进行操作,因此不是正解。
反过来想一想,如果我们从n开始倒着求,还是用类似的思路,可以保证系数所乘的数是目前的最优解,可以解决这个问题。
设初始系数为1,那么状态转移方程就是f[i]=max(f[i+1],f[i+1]x(1+0.01c)-a[i])及 f[i]=max(f[i+1],f[i+1]x(1-0.01k)+a[i])。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+7;
double f[N];
struct star{
int t;
double x;
}a[N];
int main(){
int n;
double k,c,w;
cin>>n>>k>>c>>w;
for(int i=1;i<=n;i++)cin>>a[i].t>>a[i].x;
for(int i=n;i>=1;i--){
if(a[i].t==1)f[i]=max(f[i+1],a[i].x+f[i+1]*(1-0.01*k));
else f[i]=max(f[i+1],-a[i].x+f[i+1]*(1+0.01*c));
}
printf("%.2lf",f[1]*w);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】