luogu 2577 [ZJOI2005]午餐 贪心+dp

发现让 $b$ 更大的越靠前越优,然后依次决策将每个人分给哪个窗口. 

令 $f[i][j]$ 表示考虑了前 $i$ 个人,且第一个窗口的总等待时间为 $j$ 的最小总时间. 

然后转移一下就好了~

#include <bits/stdc++.h>
#define N 201 
#define setIO(s) freopen(s".in","r",stdin) 
using namespace std;  
struct P 
{
    int a,b; 
    P(int a=0,int b=0):a(a),b(b){} 
}s[N];    
int f[N][N*N],sum[N];      
bool cmp(P a,P b) 
{
    return a.b>b.b;   
}
int main() 
{ 
    // setIO("input"); 
    int n,i,j,k; 
    scanf("%d",&n); 
    for(i=1;i<=n;++i) scanf("%d%d",&s[i].a,&s[i].b); 
    sort(s+1,s+1+n,cmp);        
    for(i=1;i<=n;++i) sum[i]=sum[i-1]+s[i].a;   
    memset(f,127,sizeof(f));  
    f[0][0]=0;    
    for(i=1;i<=n;++i) 
    {
        for(j=0;j<=sum[i];++j) 
        {
            if(j>=s[i].a) 
            {
                f[i][j]=min(f[i][j], max(f[i-1][j-s[i].a], j+s[i].b));    
            }
            f[i][j]=min(f[i][j], max(f[i-1][j], sum[i]-j+s[i].b));               
        }
    }
    int ans=1000000000;  
    for(i=1;i<=sum[n];++i) 
    {
        ans=min(ans, f[n][i]);   
    }
    printf("%d\n",ans);        
    return 0; 
}

  

posted @ 2019-09-25 15:39  EM-LGH  阅读(135)  评论(0)    收藏  举报