T1373:鱼塘钓鱼(fishing)

原题链接: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;
}
鱼塘钓鱼

注意点:

  1. pair的用法(按照第一个元素降序排序,第一个元素相等时按照第二个元素降序排序)
  2. 放入容器时,用make_pair();

 

猜你喜欢

转载自www.cnblogs.com/zoom1109/p/11269562.html
今日推荐