洛谷 P1717 钓鱼
原创
©著作权归作者所有:来自51CTO博客作者mb5f5b1df7f1e34的原创作品,请联系作者获取转载授权,否则将追究法律责任
题目描述
话说发源于小朋友精心设计的游戏被电脑组的童鞋们藐杀之后非常不爽,为了表示安慰和鼓励,VIP999决定请他吃一次“年年大丰收”,为了表示诚意,他还决定亲自去钓鱼,但是,因为还要准备2013NOIP,z老师只给了他H(1<=H<=16)个小时的空余时间,假设有N(2<=n<=25)个鱼塘都在一条水平路边,从左边到右编号为1、2、3、。。。、n)。VIP是个很讲究效率的孩子,他希望用这些时间钓到尽量多的鱼。他从湖1出发,向右走,有选择的在一些湖边停留一定的时间钓鱼,最后在某一个湖边结束钓鱼。他测出从第I个湖到I+1个湖需要走5*ti分钟的路,还测出在第I个湖边停留,第一个5分钟可以钓到鱼fi,以后再每钓5分钟鱼,鱼量减少di。为了简化问题,他假定没有其他人钓鱼,也不会有其他因素影响他钓到期望数量的鱼。请编程求出能钓最多鱼的数量。
输入输出格式
输入格式:
第一行:湖的数量n。
第二行:时间h(小时)。
第三行:n个数,f1,f2,…fn。
第四行:n个数,d1,d2,….dn。
第五行:n-1个数,t1,t2,….tn-1
输出格式:
一个数,所能钓鱼的最大数量。
输入输出样例
输入样例#1:
复制
2
1
10 1
2 5
2
跟这题思路一模一样。
#include<bits/stdc++.h>
using namespace std;
#define fish first
#define lake second
priority_queue<pair<int,int> >heap;//pair表示先按照第一个元素降序,第一个元素相等时,按照第二个元素降序
int main()
{
int n,f[101],d[101],t[101],tot;
cin>>n;
cin>>tot;
tot=tot*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]);
int t1=0,maxx=0;
for(int k=1;k<=n;k++)//枚举每个池塘为最后的钓鱼池塘
{
int time=tot-t1;
int ans=0;
for(int i=1;i<=k;i++)
heap.push(make_pair(f[i],i));
while(time>0&&heap.top().fish>0)
{
pair<int,int>a=heap.top();
heap.pop();
ans+=a.fish;
a.fish-=d[a.lake];
heap.push(a);//堆维护
time-=5;
}
maxx=max(maxx,ans);
t1+=5*t[k];
}
cout<<maxx<<endl;
return 0;
}