• 【bzoj1899】[Zjoi2004]Lunch 午餐 dp


    题目描述

    上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂。这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭。由于每个人的口味(以及胃口)不同,所以他们要吃的菜各有不同,打饭所要花费的时间是因人而异的。另外每个人吃饭的速度也不尽相同,所以吃饭花费的时间也是可能有所不同的。 THU ACM小组的吃饭计划是这样的:先把所有的人分成两队,并安排好每队中各人的排列顺序,然后一号队伍到一号窗口去排队打饭,二号队伍到二号窗口去排队打饭。每个人打完饭后立刻开始吃,所有人都吃完饭后立刻集合去六教地下室进行下午的训练。 现在给定了每个人的打饭时间和吃饭时间,要求安排一种最佳的分队和排队方案使得所有人都吃完饭的时间尽量早。 假设THU ACM小组在时刻0到达十食堂,而且食堂里面没有其他吃饭的同学(只有打饭的师傅)。每个人必须而且只能被分在一个队伍里。两个窗口是并行操作互不影响的,而且每个人打饭的时间是和窗口无关的,打完饭之后立刻就开始吃饭,中间没有延迟。 现在给定N个人各自的打饭时间和吃饭时间,要求输出最佳方案下所有人吃完饭的时刻。

    输入

    第一行一个整数N,代表总共有N个人。 以下N行,每行两个整数 Ai,Bi。依次代表第i个人的打饭时间和吃饭时间。

    输出

    一个整数T,代表所有人吃完饭的最早时刻。

    样例输入

    5
    2 2
    7 7
    1 3
    6 4
    8 5

    样例输出

    17


    题解

    dp

    首先显然的贪心思路:吃饭慢的先打饭。

    那么先将每个人按照吃饭时间倒序排序,然后考虑dp。

    本题的状态比较巧妙:

    设$f[i][j]$表示前$i$个人,总共在第一个窗口打饭的总时间为$j$,能够得到的最短总时间。

    那么只要设出了合理的状态就可以愉快的dp啦!

    时间复杂度$O(n^3)$。

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #define N 210
    using namespace std;
    struct data
    {
    	int a , b;
    	bool operator<(const data &x)const {return b > x.b;}
    }v[N];
    int sum[N] , f[N][N * N];
    int main()
    {
    	int n , i , j , m = 0 , ans = 1 << 30;
    	scanf("%d" , &n);
    	for(i = 1 ; i <= n ; i ++ ) scanf("%d%d" , &v[i].a , &v[i].b) , m += v[i].a;
    	sort(v + 1 , v + n + 1);
    	for(i = 1 ; i <= n ; i ++ ) sum[i] = sum[i - 1] + v[i].a;
    	memset(f , 0x3f , sizeof(f));
    	f[0][0] = 0;
    	for(i = 1 ; i <= n ; i ++ )
    	{
    		for(j = v[i].a ; j <= m ; j ++ ) f[i][j] = min(f[i][j] , max(f[i - 1][j - v[i].a] , j + v[i].b));
    		for(j = 0 ; j <= m ; j ++ ) f[i][j] = min(f[i][j] , max(f[i - 1][j] , sum[i] - j + v[i].b));
    	}
    	for(i = 0 ; i <= m ; i ++ ) ans = min(ans , f[n][i]);
    	printf("%d
    " , ans);
    	return 0;
    }
    

     

  • 相关阅读:
    java总结1
    immutable
    iconfont
    实战build-react(三)+ style-components
    PHP判断字符串的包含
    win7 64位操作系统中 Oracle 11g 安装教程(图解)
    我在博客园写博客的原因
    面向对象程序设计-C++_课时17函数重载和默认参数
    面向对象程序设计-C++_课时16子类父类关系
    面向对象程序设计-C++_课时14对象组合_课时15继承
  • 原文地址:https://www.cnblogs.com/GXZlegend/p/7491612.html
Copyright © 2020-2023  润新知