设状态转移方程
f[i][j]表示前i个人打饭,目前第一窗口的最后一个打完饭的时间是j,最后一个吃完饭的人的时间。
然后n^3转移。
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; struct P{ int a,b; bool operator < (const P &rhs) const {return b>rhs.b;} }p[205]; int n,m,f[205][205*205],sum[205],mx; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d%d",&p[i].a,&p[i].b);//,mx+=p[i].a; sort(p+1,p+1+n); for(int i=1;i<=n;i++) sum[i]=sum[i-1]+p[i].a; memset(f,0x3f,sizeof f); f[0][0]=0; for(int i=1;i<=n;i++) { for(int j=0;j<=sum[i];j++) { if(j>=p[i].a)f[i][j]=min(f[i][j],max(f[i-1][j-p[i].a],j+p[i].b)); f[i][j]=min(f[i][j],max(f[i-1][j],sum[i]-j+p[i].b)); } } int ans=0x3f3f3f3f; for(int i=0;i<=sum[n];i++) ans=min(ans,f[n][i]); cout<<ans; }