原题链接:1373:鱼塘钓鱼(fishing)
解题思路:
由于在走路时,鱼的数量不会减少,那我们此时可以先减去路上可能花掉的时间,用剩下的时间来找最多的鱼,然后从左向右走,k枚举能到达的最远的鱼塘,然后开一个大根堆选出最多能选的鱼,当然别忘了每次减去路上的花费(只走一次);
大根堆的关键字用num[i] 与 i ;
代码如下:
#include<iostream> #include<queue> using namespace std; typedef pair<int, int> pr; //pair表示先按照第一个元素降序排序,第一个元素相等时按照第二个元素降序排序 int num[110], reduce[110], nxt[110]; priority_queue<pr> q; int main(){ int n, deadline, t1 = 0, ans, maxn = -1; cin >> n; for(int i = 1; i <= n; i++) cin >> num[i]; for(int i = 1; i <= n; i++) cin >> reduce[i]; for(int i = 1; i < n; i++) cin >> nxt[i]; cin >> deadline; for(int k = 1; k <= n; k++){ //枚举最远走到的池塘的编号 int tim = deadline - t1; //计算剩余时间 ans = 0; for(int i = 1; i <= k; i++){ //收集能够钓鱼的池塘的资料 q.push(make_pair(num[i], i)); } while(q.top().first > 0 && tim > 0){ pr hp = q.top(); q.pop(); ans += hp.first; //贪心选取鱼最多的池塘 hp.first -= reduce[hp.second]; //修改鱼的数量 q.push(hp); tim--; ////剩余时间变少 } if(maxn < ans) maxn = ans; //刷新最优解 t1 += nxt[k]; //累计走路需要的时间 } cout << maxn << endl; return 0; }
注意点:
- pair的用法(按照第一个元素降序排序,第一个元素相等时按照第二个元素降序排序)
- 放入容器时,用make_pair();