【題解】魚塘釣魚

題目描述

        有N個魚塘排成一排(N<100),每一個魚塘中有必定數量的魚,例如:N=5時,以下表:ios

Failed to load picture

        即:在第1個魚塘中釣魚第1分鐘內可釣到10條魚,第2分鐘內只能釣到8條魚,......,第5分鐘之後再也釣不到魚了。從第1個魚塘到第2個魚塘須要3分鐘,從第2個魚塘到第3個魚塘須要5分鐘,......ide

        給出一個截止時間T(T<1000),設計一個釣魚方案,從第1個魚塘出發,但願能釣到最多的魚。假設能釣到魚的數量僅和已釣魚的次數有關,且每次釣魚的時間都是整數分鐘。spa

 

輸入格式

        共5行,分別表示:設計

        第一行爲整數N;code

        第二行爲第1分鐘各個魚塘能釣到的魚的數量,每一個數據之間用一空格隔開;blog

        第三行爲每過1分鐘各個魚塘釣魚數的減小量,每一個數據之間用一空格隔開;it

        第四行爲當前魚塘到下一個相鄰魚塘須要的時間;io

        第五行爲截止時間T。class

 

輸出格式

        僅一個整數,表示能釣到的最多的魚。
stream

 

輸入樣例

5

10 14 20 16 9

2 4 6 5 3

3 5 4 4

14

 

輸出樣例

76

 

題解

        咱們其實能夠枚舉從魚塘$1$走到魚塘$i$,在這過程當中釣到的魚的最大值。

        咱們先提早減去來往魚塘之間的時間,這樣實際上就是轉換成每次任意選第$1$到第$i$個魚塘來釣魚,用堆維護一下便可。

#include <iostream> #include <cstdio> #include <queue> #include <map>

#define MAX_N (100 + 5)

using namespace std; int n; int a[MAX_N], b[MAX_N], c[MAX_N]; int t; priority_queue <pair <int, int> > q; int ans; int main() { scanf("%d", &n); for(register int i = 1; i <= n; ++i) { scanf("%d", a + i); } for(register int i = 1; i <= n; ++i) { scanf("%d", b + i); } for(register int i = 1; i < n; ++i) { scanf("%d", c + i); } scanf("%d", &t); int tmp, sum, val, idx; for(register int i = 1; i <= n && t > 0; ++i) { while(!q.empty()) q.pop(); for(register int j = 1; j <= i; ++j) { q.push(make_pair(a[j], j)); } tmp = t; sum = 0; while(tmp-- && !q.empty()) { val = q.top().first; idx = q.top().second; q.pop(); sum += val; val -= b[idx]; if(val > 0) q.push(make_pair(val, idx)); } ans = max(ans, sum); t -= c[i]; } printf("%d", ans); return 0; } 
參考程序
相關文章
相關標籤/搜索