3.9 1262. 鱼塘钓鱼

本文介绍了如何使用优先队列(大根堆)解决ACWing题库中的鱼塘钓鱼问题,通过计算每个鱼塘的钓鱼时间并不断选择最大鱼数量,实现横跳路线的优化。
摘要由CSDN通过智能技术生成
#include <bits/stdc++.h>
 using namespace std;
 int n;
 int a[110],b[110],spend[110];
  typedef pair<int,int> PII; 
   #define x first
   #define y second
   priority_queue<PII> q; //大根堆,队头是最大的
   
   int main()
   {
   	cin >> n;
   	//a[]:钓鱼起始数量 
   	for(int i = 1;i<=n;i++) cin >> a[i];
   	//b[]:钓鱼的减少量公差 
	for(int i = 1;i<=n;i++) cin >> b[i];
   	for(int i = 2;i<=n;i++) 
	   {
         cin >> spend[i];
//前缀和求第一个鱼塘到第i个鱼塘所需要时间 
		 spend[i]+=spend[i-1];	   	
	} 
	  int T;
	  cin >> T;
	  int ans = 0;
   	 for(int i =1;i<=n;i++)  //枚举鱼塘,求前1个,前2个,前3个,,,前n个鱼数量 
    {
    	int fish_time = T - spend[i];//钓鱼时间
         for(int k = 1;k<=i;k++)
            q.push({a[k],k});
          int fish = 0; //表示最远到第i个鱼塘  
		while(q.size()&&fish_time>0)	
		{
			PII t = q.top();
			q.pop();
			int id = t.y;
			fish+=t.x;
			fish_time--;
			//更新下一分钟钓鱼的数量 
		    t.x-=b[id]; 	
			
		if(t.x>0) q.push({t.x,id});
			
		}	
	
   	 	ans = max(ans,fish);

	}
   	
   	
   	cout << ans <<endl; 
   	
   	
   	
   	return 0;
   }

1262. 鱼塘钓鱼 - AcWing题库

1.判断能不能横跳走 : 鱼的数量和钓的次数有关,路线一条走即可,横跳消耗时间

2.由题意可得 :每次选取最大值,使用 priority_queue;

  q.push{a[k],k};//进队

 q.top();取堆首元素

q.pop():堆顶元素出堆

//枚举前1次,前俩次,前三次--- 前n次的鱼最大数量,更新鱼最大数量

for(int i = 1;i<=n;i++)

{

  while(q.size()&& fish_time>0)

{   

PII  t  = t.top();

q.pop();

fish+= t.x;

int id = t.y;

fish_time --;

t.x-=b[id];   

if(t.x>0)    q.push({t.x,id});

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值