【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;
}
谢谢大家
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构