專做短篇的網站百度站長工具域名查詢
有 N
個魚塘排成一排,每個魚塘中有一定數量的魚,例如:N=5
時,如下表:
魚塘編號 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
第1分鐘能釣到的魚的數量 (1…1000) | 10 | 14 | 20 | 16 | 9 |
每釣魚1分鐘釣魚數的減少量(1…100) | 2 | 4 | 6 | 5 | 3 |
當前魚塘到下一個相鄰魚塘需要的時間(單位:分鐘) | 3 | 5 | 4 | 4 |
即:在第 1 1 1 個魚塘中釣魚第 1 1 1 分鐘內可釣到 10 10 10 條魚,第 2 2 2 分鐘內只能釣到 8 8 8 條魚,……,第 5 5 5 分鐘以后再也釣不到魚了。
從第 1 1 1 個魚塘到第 2 2 2 個魚塘需要 3 3 3 分鐘,從第 2 2 2 個魚塘到第 3 3 3 個魚塘需要 5 5 5 分鐘,……
給出一個截止時間 T T T,設計一個釣魚方案,從第 1 1 1 個魚塘出發(fā),希望能釣到最多的魚。
假設能釣到魚的數量僅和已釣魚的次數有關,且每次釣魚的時間都是整數分鐘。
輸入格式
共 5 5 5 行,分別表示:
第 1 1 1 行為 N N N;
第 2 2 2 行為第 1 1 1 分鐘各個魚塘能釣到的魚的數量,每個數據之間用一空格隔開;
第 3 3 3 行為每過 1 1 1 分鐘各個魚塘釣魚數的減少量,每個數據之間用一空格隔開;
第 4 4 4 行為當前魚塘到下一個相鄰魚塘需要的時間;
第 5 5 5 行為截止時間 T T T。
輸出格式
一個整數(不超過 231 ? 1 231?1 231?1),表示你的方案能釣到的最多的魚。
數據范圍
1 ≤ N ≤ 100 1≤N≤100 1≤N≤100,
1 ≤ T ≤ 1000 1≤T≤1000 1≤T≤1000
輸入樣例:
5
10 14 20 16 9
2 4 6 5 3
3 5 4 4
14
輸出樣例:
76
#include <iostream>
#include <algorithm>
#include <cstring>using namespace std;const int N = 110;int a[N], d[N], l[N], spend[N];int get(int k) { //第i分鐘在第k個魚塘釣到魚的數量return max(0, a[k] - d[k] * spend[k]);
}int work(int n, int T) { //只走前n個魚塘,且時間為T的最大收益int res = 0;memset(spend, 0, sizeof spend);for (int i = 0; i < T; i ++ ) { //按分鐘遍歷int t = 1; //t表示第i分鐘第t的魚塘的魚最多,初始為1號魚塘for (int j = 1; j <= n; j ++ ) //第i分鐘在前n個魚塘的最大收益if (get(j) > get(t))t = j;res += get(t);spend[t] ++ ; //在t號魚塘逗留時間+1}return res;
}int main() {int n, T; //n個魚塘,截止時間為Tcin >> n;for (int i = 1; i <= n; i ++ ) cin >> a[i]; //各魚塘第一分鐘產魚量for (int i = 1; i <= n; i ++ ) cin >> d[i]; //各魚塘每一分鐘減魚量for (int i = 2; i <= n; i ++ ) { //從第一個魚塘到第i個魚塘之間的距離cin >> l[i];l[i] += l[i - 1]; //因為這步求前綴和,所以前面下標i要從1開始}cin >> T;int res = 0;for (int i = 1; i <= n; i ++ ) //從第一個魚塘出發(fā),遍歷n個魚塘res = max(res, work(i, T - l[i])); //只去前i個魚塘的最大收益,這里已經減去路上所用時間cout << res << endl;
}