P1717 钓鱼 | #10009. 「一本通 1.1 练习 5」钓鱼

该问题是一个关于时间管理和效率优化的算法题。VIP999有特定时间限制去钓鱼,他需要在多个鱼塘间选择,每个鱼塘的钓鱼效率随时间递减。通过使用优先队列和贪心策略,可以计算出在给定时间内能钓到的最多鱼数。程序中采用了C++的结构体和优先队列来实现这一算法。
摘要由CSDN通过智能技术生成

钓鱼

题目描述

话说发源于小朋友精心设计的游戏被电脑组的童鞋们藐杀之后非常不爽,为了表示安慰和鼓励,VIP999 决定请他吃一次“年年大丰收”,为了表示诚意,他还决定亲自去钓鱼。

但是,因为还要准备 NOIP2013, z老师只给了他 H H H 个小时的空余时间,假设有 n n n 个鱼塘都在一条水平路边,从左边到右编号为 1, 2, 3 … n 。

VIP是个很讲究效率的孩子,他希望用这些时间钓到尽量多的鱼。他从湖1出发,向右走,有选择的在一些湖边停留一定的时间钓鱼,最后在某一个湖边结束钓鱼。他测出从第 i i i 个湖到 i + 1 i+1 i+1个湖需要走 5 × t i 5 \times t_i 5×ti 分钟的路,还测出在第 i i i 个湖边停留,第一个5分钟可以钓到鱼 f i f_i fi,以后再每钓5分钟鱼,鱼量减少 d i d_i di。为了简化问题,他假定没有其他人钓鱼,也不会有其他因素影响他钓到期望数量的鱼。请编程求出能钓最多鱼的数量。

输入格式

第一行:湖的数量n。

第二行:时间h(小时)。

第三行:n个数, f 1 f_1 f1 f 2 f_2 f2,… f n f_n fn

第四行:n个数, d 1 d_1 d1 d 2 d_2 d2,…. d n d_n dn

第五行:n-1个数, t 1 t_1 t1 t 2 t_2 t2,…. t n − 1 t_{n-1} tn1

输出格式

一个数,所能钓鱼的最大数量。

样例 #1

样例输入 #1

2
1
10  1
2  5
2

样例输出 #1

31

提示

1 <= H <= 16

2 <= n <= 25

代码

#include<bits/stdc++.h>
using namespace std;
struct P{
	int fish,d,i;
}s[10000];
struct cmp{
	bool operator () (P x,P y){
		return x.fish<y.fish;
	}
};

int t[1000];
int main(){
	int n,h;
	cin>>n>>h;h *= 12;
	for (int i=1;i<=n;i++) cin>>s[i].fish;
	for (int i=1;i<=n;i++){
		cin>>s[i].d;s[i].i=i;
	}
	for (int i=2;i<=n;i++) cin>>t[i];
	int ans=-1e8;
	for (int i=1;i<=n;i++){
		int cnt=0;
		h-=t[i];
		priority_queue<P,vector<P>,cmp > que;
		for (int j=1;j<=i;j++) que.push(s[j]);
		for (int j=1;j<=h;j++){
			P no=que.top();
			if (no.fish>0){
				cnt+=no.fish;no.fish-=no.d;
				que.pop();que.push(no);
			}
		}
		ans=max(ans,cnt);
	}
	cout<<ans;
	return 0;
}

分析

优先队列——priority_queue,priority_queue<int>是int 的优先队列,有关结构体的优先队列可以定义cmp结构体

struct cmp{
	bool operator () (P x,P y){
		return x.fish<y.fish;
	}
};

priority_queue<P,vector<P>,cmp > que;

cmp应重载()运算符,这会更方便

如果可以消去移动时间,题目便可以变成每次取最多鱼的水池的贪心题了
h-=t[i]做到了此操作,结合优先队列,此题便AC了

ans=max(ans,cnt);
记得比较

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值