瞎搞-贪心-NOIP前第45天-入门-钓鱼

一开始看了就觉得应该是DP,的确如此,但是有贪心的做法。
贪心做法就是假设只在前i个湖钓鱼,然后把中间这i-1段路程所花的时间先给扣除,剩下的就按最优的分配就可以了。i从1到n都操作一遍从得到的n个临时答案里面取最大值就是答案了。
一开始思维惯性,导致想法一直是假设当前已经处于某于第i个湖,考虑怎样去决策是要继续在当前的湖钓鱼或者是走到下一个湖,于是只能想成记忆化搜索了(也就是DP)。
没想到能从全局的角度去考虑解决,是一个要改进的思维缺陷。

#include<bits/stdc++.h>
#define rep(i,l,r) for(int i=(l);i<=(r);i++)
#define per(i,r,l) for(int i=(r);i>=(l);i--)
#define random(l,r) ((l)+rand()%((r)-(l)+1))
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int inf=1e9+10,N=150;
const double eps=1e-6;
int n,h,f[N],d[N],t[N],nowf[N],tt,ans;
int main(){
	ios::sync_with_stdio(false); cin.tie(0);
	cin>>n>>h; h*=12;
	rep(i,1,n) cin>>f[i];
	rep(i,1,n) cin>>d[i];
	t[1]=0; rep(i,2,n) cin>>tt,t[i]=t[i-1]+tt;
	rep(i,1,n){
		rep(j,1,n) nowf[j]=f[j];
		int cnt=h-t[i],now=0;
		while(cnt>0){
			int k=1;
			rep(j,1,i) if(nowf[k]<nowf[j]) k=j;
			now+=nowf[k]; nowf[k]-=d[k]; nowf[k]=max(nowf[k],0);
			cnt--;
		}
		ans=max(ans,now);
	}
	cout<<ans;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值