[模擬賽] T3 Exploit
Description
4X概念體系,是指在PC戰略遊戲中一種相當普及和成熟的系統概念,得名自4個同樣以“EX”為開頭的英語單詞。
eXplore(探索)
eXpand(拓張與發展)
eXploit(經營與開發)
eXterminate(征服)
——維基百科
今次我們著重考慮exploit部分,並將其模型簡化:
你駕駛著一臺帶有鉆頭(初始能力值w)的飛船,按既定路線依次飛過n個星球。
星球籠統的分為2類:資源型和維修型。(p為鉆頭當前能力值)
1.資源型:含礦物質量a[i],若選擇開采,則得到a[i]*p的金錢,之後鉆頭損耗k%,即p=p*(1-0.01k)
2.維修型:維護費用b[i],若選擇維修,則支付b[i]*p的金錢,之後鉆頭修復c%,即p=p*(1+0.01c)
註:維修後鉆頭的能力值可以超過初始值(你可以認為是翻修+升級)
金錢可以透支。
請作為艦長的你仔細抉擇以最大化收入。
Input
第一行4個整數n,k,c,w。
以下n行,每行2個整數type,x。
type為1則代表其為資源型星球,x為其礦物質含量a[i];
type為2則代表其為維修型星球,x為其維護費用b[i];
Output
一個實數(保留2位小數),表示最大的收入。
Solution
觀察到當前的決策對於之後的狀態有影響,不滿足無後效性,“正難則反”,我們考慮倒著推。
可以看出來一個星球選擇與否對後面的影響是成比例的,也就是說只是系數的差別。
舉個例子,第i個是資源型,我們可以搞出dp[i+1](代表從i+1開始選,1~i一概略過)的最大金錢數,欽定第i個開始選的系數為1,那麽dp[i]=max(dp[i+1], a[i]+dp[i+1]*(1-0.01*k))
轉移方程的意思是:
dp[i+1] 表示當前的不選
a[i]+dp[i+1]*(1-0.01*k) 表示當前的選,加上金錢 a[i] ,因為此後的鉆頭能力變為 (1-0.01*k) ,所以從 dp[i+1] 獲得的金錢也要乘 (1-0.01*k)
#include<cstdio> #include<iostream> using namespace std; int n; int type[100005]; double x[100005]; double k,c,w,now; signed main(){ scanf("%d%lf%lf%lf",&n,&k,&c,&w); k=1-0.01*k;c=1+0.01*c; for(int i=1;i<=n;i++) scanf("%d%lf",&type[i],&x[i]); for(int i=n;i>=1;i--){ if(type[i]==1) now=max(now,now*k+x[i]); else now=max(now,now*c-x[i]); } printf("%.2lf",now*w); return 0; }
[模擬賽] T3 Exploit