題目描述
有N個魚塘排成一排(N<100),每一個魚塘中有必定數量的魚,例如:N=5時,以下表:ios
即:在第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; }