「一本通 1.1 练习 5」钓鱼(贪心)

题目描述

在一条水平路边,有 nn 个钓鱼湖,从左到右编号为 1,2,…,n1,2,…,n。佳佳有 HH 个小时的空余时间,他希望利用这个时间钓到更多的鱼。他从 11 出发,向右走,有选择的在一些湖边停留一定的时间(是 55 分钟的倍数)钓鱼。最后在某一个湖边结束钓鱼。佳佳从第 ii 个湖到第 i+1i+1 个湖需要走 5\times T_i5×Ti​ 分钟路,还测出在第 ii 个湖停留,第一个 55 分钟可以钓到 F_iFi​ 条鱼,以后每再钓 55 分钟,可以钓到的鱼量减少 D_iDi​,若减少后的鱼量小于 00,则减少后的鱼量为 00 。为了简化问题,佳佳假定没有其他人钓鱼,也没有其他因素影响他钓到期望数量的鱼。请编程求出佳佳最多能钓鱼的数量。

输入格式

第一行一个整数 nn,表示湖的个数

第二行一个整数 HH,表示佳佳的空闲时间

第三行有 nn 个整数,依次表示每个湖第一个 55 分钟能钓到鱼的数量

第四行有 nn 个整数,依次表示以后的每5分钟钓鱼数量比前一个 55 分钟钓鱼数量减少的数量

第五行有 n-1n−1 个整数,T_iTi​ 表示由第 ii 个湖到第 i+1i+1 个湖需要花 5\times T_i5×Ti​ 分钟的路程

输出格式

输出只有一行,表示佳佳最多能钓鱼的数量。

思路:从第一个开始,到最后一个。其中到每一个池塘的路程时间可以求出来,然后就是对于走到的几个池塘,剩余时间内能得到多少鱼的问题了。比如样例中走到第一个池塘还剩60分钟,那么就用着60分钟得到最多的鱼就可以了。

中间求最多鱼的的时候用到了优先队列。

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e6+10;
const int mod=998244353;
int dx[]= {1,0,-1,0,1,1,-1,-1};
int dy[]= {0,1,0,-1,1,-1,1,-1};

int n,h;
int t[maxn];
struct Node 
{
	int x,y;
}a[maxn];
bool cmp(Node a,Node b)
{
	return a.x>b.x;
}
bool cmp1(Node a,Node b)
{
	return a.y>b.y;
}
void solve()
{
	cin>>n>>h;
	h*=60;
	for(int i=1;i<=n;i++)
		cin>>a[i].x;
	for(int i=1;i<=n;i++)
		cin>>a[i].y;
	for(int i=2;i<=n;i++)
		cin>>t[i];
	t[1]=0;
	int ans=0;
	int sum=0;
	priority_queue<pair<int ,int > > q; 
	for(int i=1;i<=n;i++)
	{
		while(!q.empty()) q.pop();
		sum=0;
		h-=t[i]*5;
		int tim=h;
		for(int j=1;j<=i;j++)
		{
			q.push(make_pair(a[j].x,a[j].y));
		}
		
		while(tim>0&&q.top().first>0)
		{
			pair<int ,int >s;
			s=q.top();q.pop();
			tim-=5;
			sum+=s.first;
			s.first-=s.second;
			q.push(s);
		}
		ans=max(ans,sum);
	}
	cout<<ans<<endl;
}
int main()
{
	solve();
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值