Advertisement

2122: 【J1】【动态规划】【优先队列】钓鱼

阅读量:

题目描述

约翰 钓鱼h小时(1≤h≤16,h*12个单位时间,5分钟为一个单位时间),

位于一条直线上的n个池塘共有2至25个。这些池塘依次编号为L₁, L₂, …, Lₙ。约翰花费tᵢ个单位时间从池塘Lᵢ前往池塘Lᵢ₊₁(其中i=1到n-1)。其出发点设于L₁位置。

约翰可以选择若干个池塘垂钓,并且在每个池塘他都可以选择任意数量的时间逗留。

随着钓鱼活动的持续进行,池塘中的鱼类数量逐渐减少.在第一个时间段内,池塘Li能够捕获的数量为Fi(其中 Fi 的取值范围为 0 到 100).随着时间的推移,在每一个后续的时间段内捕获的数量会依次减少一个固定的数值 di(其中 di 的取值范围同样是 0 到 100).为了帮助约翰实现这一目标,请设计一个算法来计算他能够捕获的最大数量鱼类的数量.

输入

输入文件第一行为一个整数n,

第二行为一个整数h,

第三行为n个用空格隔开的整数,表示Fi(i=1,2,…,n),

第四行为n个用空格隔开的整数,表示di(i=1,2,…,n),

第五行为n-1个用空格隔开的整数,表示ti(i=1,2,…,n-1)

输出

输出一个整数,表示约翰最多能钓到的鱼的数量。

样例输入

复制代码

样例输出

复制代码

Code:

复制代码
 #include<bits/stdc++.h>

    
 using namespace std;
    
 struct node{
    
 	int f,num;
    
 	bool operator<(node x)const{
    
 		return f<x.f;
    
 	}
    
 }a[10005];
    
 int n,h,d[10005],t[10005],ans;
    
 priority_queue<node>q; 
    
 int main(){
    
 	cin>>n;
    
 	cin>>h;
    
 	h*=12;
    
 	for(int i=1;i<=n;i++){
    
 		cin>>a[i].f;
    
 		a[i].num=i;
    
 	}
    
 	for(int i=1;i<=n;i++){
    
 		cin>>d[i];
    
 	}
    
 	for(int i=1;i<n;i++){
    
 		cin>>t[i];
    
 	}
    
 	for(int i=1;i<=n;i++){
    
 		h-=t[i-1];
    
 		int now=0;
    
 		while(!q.empty()){
    
 			q.pop();
    
 		}
    
 		for(int j=1;j<=i;j++){
    
 			q.push(a[j]);
    
 		}
    
 		for(int j=1;j<=h;j++){
    
 			node s=q.top();
    
 			if(s.f>0){
    
 				now+=s.f;
    
 			}
    
 			s.f-=d[s.num];
    
 			q.pop();
    
 			q.push(s);
    
 		}
    
 		ans=max(ans,now);
    
 	}
    
 	cout<<ans;
    
     return 0;
    
 }

全部评论 (0)

还没有任何评论哟~