1. 程式人生 > >[模擬賽] T3 Exploit

[模擬賽] T3 Exploit

cst name double body san ace 表示 pac 開發

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