【LOJ10009】钓鱼【贪心】

                              钓鱼

              时间限制: 1000 ms         内存限制: 65536 KB 

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

【输入】
第一行一个整数 n,表示湖的个数

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

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

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

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

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

【输入样例】
3
1
4 5 6
1 2 1
1 2
【输出样例】
35
【提示】
样例解释:

在第 1 个湖钓 15 分钟,共钓得 4+3+2=9 条鱼;

在第 2 个湖钓 10 分钟,共钓得 5+3=8 条鱼;

在第 3 个湖钓 20 分钟,共钓得 6+5+4+3=18 条鱼;

从第 1 个湖到第 2 个湖,从第 2 个湖到第 3个湖,共用时间 15 分钟,共得 35 条鱼,并且这是最多的数量。

分析:题目中说了某些湖,我们就要枚举每一个湖作为结束点,然后用总时间减去走路的时间除以5就会得到能钓鱼的次数,记为sum。
如样例:

第一个湖:4 3 2 1 0 0 0…
第二个湖:5 3 1 0 0 0…
第三个湖:6 5 4 3 2 1 0 0 0…

此题就是让我们从中选择sum个最大的数。
为什么?假设我们在第i个湖中选了x个数,在j个湖中选了y个数,就相当于我们在第i个湖中钓了x次鱼,在第j个湖中钓了y次鱼了
因为d【i】>=0,所以所有数列呈递减排序,于是如果我们要选择某一个数列的第i个数,这个数列的前i-1个数都已经被选了(因为比第i个数大),所以是符合题意的
代码如下,用优先队列优化:

#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
struct Node
{
	int Num,bl;//bl表示变量,即每过五分钟减少的钓鱼量
	bool operator<(const Node &a) const
	{
		return a.Num>Num;
	}
};
priority_queue<Node> q;
int n,h;
int f[110];
int d[110];
int t[110];
int ans;
int sum;
int m,Sum;
int main()
{
	Node temp;
	scanf("%d",&n);
	scanf("%d",&h);
	h*=60;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&f[i]);
	}
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&d[i]);
	}
	for(int i=1;i<n;i++)
	{
		scanf("%d",&t[i]);
		t[i]*=5;
	}
	for(int i=1;i<=n;i++)
	{
		Sum+=t[i-1];
		m=h-Sum;
		m/=5;
		sum=0;
		for(int j=1;j<=i;j++)
		{
			temp.Num=f[j];
			temp.bl=d[j];
			q.push(temp);
		}
		while(m>0&&q.top().Num>0)//注意m可能小于0
		{
			sum+=q.top().Num;
			temp.Num=q.top().Num-q.top().bl;
			temp.bl=q.top().bl;
			q.pop();
			q.push(temp);
			m--;
		}
		ans=max(ans,sum);
	}
	printf("%d",ans);
	return 0;
}

谢谢大家

posted @ 2018-08-28 16:59  最爱丁珰  阅读(49)  评论(0编辑  收藏  举报