2 条题解
-
0
贪心或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
暴力枚举,但是会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
- 上传者