[題解][洛谷P1412] 經營與開發

ZWZWW發表於2024-04-19

題目描述

給定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);
} 

相關文章