洛谷P2979 cheese towers

题目链接:https://www.luogu.com.cn/problem/P2979

题意:有n种奶酪,每种有高度h和价值v,高度>=k称为大奶酪。大的压在上面,下面所有奶酪的高度会变为原来的4/5(只考虑最上面的一个大奶酪的效果,意思是下面的不会重复被压缩4/5)。现在给定最大高度t,求能得到的最大价值。

想了一个奇怪的做法:f[j]表示高度为j的最大价值。给奶酪升序排序,因为大奶酪在上面更优。先开一个f2数组直接做完全背包,之后再用f2数组更新f数组的状态:如果当前i不是大奶酪就还是直接做完全背包,

否则就用方程f[(j-a[i].h)/5*4+a[i].h]=max(f[(j-a[i].h)/5*4+a[i].h],f2[j-a[i].h]+a[i].v)更新压缩后的价值,最后再高度为0-T中取最大价值即可。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int maxt=2000+10;
 5 struct st{int v,h;}a[maxt];
 6 int f[maxt],f2[maxt],n,t,k,i,j,ans;
 7 
 8 bool cmp(st p,st q){return p.h<q.h;}
 9 
10 int main(){
11     cin>>n>>t>>k;
12     for (i=1;i<=n;i++) cin>>a[i].v>>a[i].h;
13     sort(a+1,a+n+1,cmp); 
14     for (i=1;i<=n;i++)
15       for (j=a[i].h;j<=t*2;j++)
16          f2[j]=max(f2[j],f2[j-a[i].h]+a[i].v);
17     for (i=1;i<=n;i++)
18       for (j=0;j<=t*2;j++)
19         if (a[i].h<=j&&j%5==0){
20             if (a[i].h<k) f[j]=max(f[j],f[j-a[i].h]+a[i].v);
21           else f[(j-a[i].h)/5*4+a[i].h]=max(f[(j-a[i].h)/5*4+a[i].h],f2[j-a[i].h]+a[i].v);
22         }
23     for (i=0;i<=t;i++) ans=max(ans,f[i]);
24     cout<<ans<<endl;
25     return 0;
26 }
洛谷2979

 

posted @ 2020-05-29 14:49  coastal_taipan  阅读(144)  评论(0编辑  收藏  举报