2 条题解

  • 0
    @ 2023-4-7 20:58:14

    贪心或dp。 这里只展示贪心做法。

    贪心

    #include <bits/stdc++.h>
    using namespace std;
    int a[100010],dc=0,n,h,t[110],f[110],d[110],i,j,k,ans=0;
    int cmp(int p, int q) {
    	return p>q;
    }
    int main(){
        cin>>n>>h;
        h*=12;
        for(i=1;i<=n;i++) cin>>f[i];
        for(i=1;i<=n;i++) cin>>d[i];
        t[1]=0;
        for(i=2;i<=n;i++) cin>>t[i];
        for(i=1;i<=n;i++){
            h-=t[i];
            if(h<=0)
            break;
        for(j=f[i],k=1;j>0 && k<=h;j-=d[i],k++) a[dc++]=j;
        sort(a,a+dc,cmp);
        k=0;
        for(j=0;j<dc && j<h;j++) k+=a[j];
        if(k>ans)
        ans=k;
        }
        cout<<ans;
        return 0;
    }
    

    dp

    #include <bits/stdc++.h>
    using namespace std;
    const int N=1001;
    int n,h,x,sum[N],f[N],d[N],dp[N][N],ans=0;
    int main() {
    	scanf("%d%d",&n,&h);h*=12;
    	for(int i=1;i<=n;i++)scanf("%d",f+i);
    	for(int i=1;i<=n;i++)scanf("%d",d+i);
    	for(int i=2;i<=n;i++)scanf("%d",&x),sum[i]=sum[i-1]+x;
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=h-sum[i];j++){
    			dp[i][j]=dp[i][j-1];
    			for(int k=0;k<=j;k++){
    				if((k-1)*d[i]>f[i])break;
    				int sum=(f[i]+f[i]-(k-1)*d[i])*k/2;
    				dp[i][j]=max(dp[i][j],dp[i-1][j-k]+sum);
    			}
    			ans=max(ans,dp[i][j]);
    		}	
    	}
    	printf("%d",ans);
    }
    
    • 0
      @ 2022-11-26 11:28:00

      暴力枚举,但是会T,后面有正常代码。

      #include <iostream>
      int t,g,tt=0;
      using namespace std;
      
      struct lake
      {
          int f,fl,tn;
      }la[1000];
      
      int next(int ln,int f,int tn,int kk)
      {
          int b=0;
          int a=0;
          if (kk<t){
          if(f>0){a=f+next(ln,f-la[ln].fl,tn,kk+1);}
          if (la[ln+1].f!=0){b=next(ln+1,la[ln+1].f,la[ln+1].tn,kk+=tn);}
      
          return max(a,b);
          }
          else return 0;
      }
      
      
      int main()
      {
      
          cin>>g>>t;
          t*=12;
          for(int i=1;i<=g;i++)
          {
              cin>>la[i].f;
          }
          for(int i=1;i<=g;i++)
          {
              cin>>la[i].fl;
          }
          for(int i=1;i<g;i++)
          {
              cin>>la[i].tn;
          }
          cout <<next(1,la[1].f,la[1].tn,0)<< endl;
          return 0;
      }
      

      正常代码

      #include <bits/stdc++.h>
      #define INF 0x3f3f3f3f
      using namespace std;
      int n, h, f[110], d[110], t[110], ans, tot; 
      priority_queue < int, vector < int >, greater < int > > pru; 
      int main()
      {
          scanf("%d %d", &n, &h); h *= 12; 
          for(int i = 1; i <= n; ++i) scanf("%d", &f[i]); for(int i = 1; i <= n; ++i) scanf("%d", &d[i]); for(int i = 1; i < n; ++i) scanf("%d", &t[i]);
          for(int i = 1; i <= n && h > 0; h -= t[i], ++i)
          {
              for(int o = 1; o <= 1000 && f[i] > 0; ++o) pru.push(f[i]), tot += f[i], f[i] -= d[i]; 
              while(pru.size() > h) tot -= pru.top(), pru.pop(); 
              ans = max(ans, tot);
          }
          printf("%d", ans);
          return 0;
      }
      
      • 1

      信息

      ID
      479
      时间
      1000ms
      内存
      512MiB
      难度
      3
      标签
      递交数
      40
      已通过
      22
      上传者