[ZJOI2005]午餐

设状态转移方程

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;
}
[ZJOI2005]午餐

 

posted @ 2018-10-03 21:25  SWHsz  阅读(122)  评论(0编辑  收藏  举报