1. 程式人生 > >瞎搞-貪心-NOIP前第45天-入門-釣魚

瞎搞-貪心-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; }