1 条题解

  • 1
    @ 2025-8-23 10:52:06

    贪心例题

    对于这类贪心问题,可以先对只有一个鱼塘时最大钓鱼量是多少,再增加第二个,有两个鱼塘时最大钓鱼量是多少,一直到第 n 个[1] (注:增加到第 i 个时需要减去相应的路上花费的时间)

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e2+10;
    int fish[N],d[N],vis[N],s[N];
    int n,h,k,ans;
    bool cmp(int a,int b){return a>b;}
    int main(){cin>>n>>h;
    	for(int i=1;i<=n;i++)cin>>fish[i];
    	for(int i=1;i<=n;i++)cin>>d[i];
    	for(int i=2;i<=n;i++)cin>>vis[i];
    	vis[1]=0;h*=12;
    	for(int i=1,x;i<=n;i++){
    		h-=vis[i];//去掉走到第i个时花费的时间 
    		if(h<=0)break;
    		for(int j=fish[i],t=1;j>0&&t<=h;j-=d[i],t++)
    			s[k++]=j;//加上该鱼塘能钓的鱼的数量 
    		sort(s,s+k,cmp);x=0;
    		for(int u=1,v=0;v<k&&u<=h;v++,u++)
    			x+=s[v];//从大到小在时间h内能钓鱼的数量 
    		if(x>ans)ans=x;
    	}cout<<ans;
    	return 0;
    }
    

    1. 根据我前面的描述与做法,或许有人注意到了,这似乎像是个背包.但这道题不适合用背包dp.因为每个湖每次钓的鱼数不一样,且湖之间转移需要花费额外的代价.用dp做还不如直接建图搜最长路. ↩︎

    信息

    ID
    23
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    4
    已通过
    1
    上传者