【题目描述】
有N个鱼塘排成一排(N<100),每个鱼塘中有一定数量的鱼,例如:N=5时,如下表:
鱼塘编号每1分钟能钓到的鱼的数量(1..1000)每1分钟能钓鱼数的减少量(1..100)当前鱼塘到下一个相邻鱼塘需要的时间(单位:分钟)11023214453206441654593鱼塘编号12345每1分钟能钓到的鱼的数量(1..1000)101420169每1分钟能钓鱼数的减少量(1..100)24653当前鱼塘到下一个相邻鱼塘需要的时间(单位:分钟)3544
即:在第1个鱼塘中钓鱼第1分钟内可钓到10条鱼,第2分钟内只能钓到8条鱼,……,第5分钟以后再也钓不到鱼了。从第1个鱼塘到第2个鱼塘需要3分钟,从第2个鱼塘到第3个鱼塘需要5分钟,……
给出一个截止时间T(T<1000),设计一个钓鱼方案,从第1个鱼塘出发,希望能钓到最多的鱼。
假设能钓到鱼的数量仅和已钓鱼的次数有关,且每次钓鱼的时间都是整数分钟。
【输入】
共5行,分别表示:
第1行为N;
第2行为第1分钟各个鱼塘能钓到的鱼的数量,每个数据之间用一空格隔开;
第3行为每过1分钟各个鱼塘钓鱼数的减少量,每个数据之间用一空格隔开;
第4行为当前鱼塘到下一个相邻鱼塘需要的时间;
第5行为截止时间T。
【输出】
一个整数(不超过231−1231−1),表示你的方案能钓到的最多的鱼。
【输入样例】
5 10 14 20 16 9 2 4 6 5 3 3 5 4 4 14
【输出样例】
76
#include <bits/stdc++.h> using namespace std; struct Node { int num; // 鱼的数量 int idx; // 鱼塘编号 Node(int n, int i) { // 构造函数 num = n, idx = i; } friend bool operator<(const Node &a, const Node &b) { // 友元函数,大根堆排序(小在前) if (a.num == b.num) { return a.idx > b.idx; } else { return a.num < b.num; } } }; int main() { // freopen("in.txt", "r", stdin); int n; cin >> n; vector<int> a(n + 1); // 鱼量 for (int i = 1; i <= n; i++) { cin >> a[i]; } vector<int> b(n + 1); // 减量 for (int i = 1; i <= n; i++) { cin >> b[i]; } vector<int> c(n + 1); // 时间 for (int i = 1; i < n; i++) { cin >> c[i]; } int tt; // 可用的总时间 cin >> tt; int tu = 0; // 已用时间 int mx = 0; // 最优方案 for (int k = 1; k <= n; k++) { // 点位 priority_queue<Node> q; // 优先队列 for (int i = 1; i <= k; i++) { q.push(Node(a[i], i)); // printf("a[%d]=%d ", i, a[i]); } int sum = 0; // 和 // printf("\nt=%d: ", tt - tu); // 剩余时间 for (int t = tt - tu; t > 0 && !q.empty(); t--) { // 剩余时间 Node top = q.top(); // 贪心 q.pop(); // 弹出 // printf("[%d]=%d,", top.idx, top.num); sum += top.num; // 累加 top.num -= b[top.idx]; if (top.num > 0) { q.push(top); } } // printf("s=%d\n", sum); if (mx < sum) { mx = sum; } tu += c[k]; // 时间累加 } cout << mx << endl; return 0; }