noip模擬賽 經營與開發
題目描述
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)
註:維修後鉆頭的能力值可以超過初始值(你可以認為是翻修+升級)
請作為艦長的你仔細抉擇以最大化收入。
輸入輸出格式
輸入格式:
第一行4個整數n,k,c,w。
以下n行,每行2個整數type,x。
type為1則代表其為資源型星球,x為其礦物質含量a[i];
type為2則代表其為維修型星球,x為其維護費用b[i];
輸出格式:
一個實數(保留2位小數),表示最大的收入。
輸入輸出樣例
輸入樣例#1:5 50 50 10 1 10 1 20 2 10 2 20 1 30輸出樣例#1:
375.00
說明
對於30%的數據 n<=100
另有20%的數據 n<=1000;k=100
對於100%的數據 n<=100000; 0<=k,c,w,a[i],b[i]<=100;保證答案不超過10^9.
分析:思路比較巧妙。
這道題一眼看上去就覺得一定要dp,但是如果設f[i]為1~i的最大收益的話,顯然鉆頭的能力值有後效性,那麽怎麽辦呢?假設f[i]為i~n的最大收益,如果i選了,那麽受影響的就是i+1,假設我們預先知道i+1受影響後的值,我們就能推出i的值了,就沒有後效性了.
如果一個dp題i對i以後的所有點都有後效性,那麽可以考慮反過來做.
#include<cstdio> #include<algorithm> using namespace std; const int maxn = 100010; int n, w, t[maxn], a[maxn]; doublek, c, ans; int main() { scanf("%d%lf%lf%d", &n, &k, &c, &w); k = 1 - 0.01*k; c = 1 + 0.01*c; for (int i = 1; i <= n; i++) scanf("%d%d", &t[i], &a[i]); for (int i = n; i; i--) if (t[i] == 1) ans = max(ans, ans*k + a[i]); else ans = max(ans, ans*c - a[i]); printf("%.2lf\n", ans*w); return 0; }
noip模擬賽 經營與開發