瞎搞-貪心-NOIP前第45天-入門-釣魚
阿新 • • 發佈:2018-11-11
一開始看了就覺得應該是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;
}