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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/TengWan_Alunl/article/details/82729966

一开始看了就觉得应该是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;
}

猜你喜欢

转载自blog.csdn.net/TengWan_Alunl/article/details/82729966