• 题解 P2577 【[ZJOI2005]午餐】


    Solution [ZJOI2005]午餐

    题目大意:每个人有一个打饭时间和吃饭时间,求把所有人分到两个队伍,所有人都吃完饭的最短时间

    动态规划,贪心


    分析:既然每个人有一个吃饭时间和打饭时间,我们可以大胆猜想,让吃的慢的人先打饭

    我有一个比较迷的证明,不知道对不对……

    假如只有一个队列,设打饭时间为(A),吃饭时间为(B)

    (ans = max{sum_{j = 1}^{i}A_j+B_i quad | quad 1 in [1,n]})

    假如有两个人编号(1),(2)

    第一种情况:(ans_1 = max{A_1+B_1,A_1+A_2+B_2}=A_1+A_2+B_2)

    第二种情况:(ans_2 = max{A_2 + B_2,A_1 + A_2 + B_1} = A_1 + A_2 + B_1)

    假如第一种情况更优:(ans_1 < ans_2 implies B_2 < B_1)

    所以我们按照(B)值降序排列可以使答案最优,然后我们考虑(dp)

    (f[i][j][k])表示前(i)个人,第(1)个队列的打饭时间之和为(j),第(2)个队列的打饭时间为(k)的最优答案,转移显然,数组会爆

    我们发现第(3)维可以略去,因为我们知道(sum_1^iA_i),以及第一个队列的(sum A),我们就可以算出第二个队列的(sum A),这个有点像方格取数的优化

    然后(f[i][j] = egin{cases} max {f[i-1][j - A_i],j + B_i} quad j geq A_i \ max{f[i-1][j],sum_{j=1}^iA_j-j+B_i} end{cases})

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int maxn = 201;
    struct Person{
    	int A,B;
    	bool operator < (const Person &rhs)const{
    		return B > rhs.B;
    	}
    }person[maxn];
    int n,ans = 0x7fffffff,sum,f[maxn][40001];
    int main(){
    	scanf("%d",&n);
    	for(int i = 1;i <= n;i++)
    		scanf("%d %d",&person[i].A,&person[i].B);
    	sort(person + 1,person + 1 + n);
    	memset(f,0x3f,sizeof(f));
    	f[0][0] = 0;
    	for(int i = 1;i <= n;i++){
    		sum += person[i].A;
    		for(int j = 0;j <= sum;j++){
    			if(j >= person[i].A)f[i][j] = min(f[i][j],max(f[i - 1][j - person[i].A],j + person[i].B));
    			f[i][j] = min(f[i][j],max(f[i - 1][j],sum - j + person[i].B));
    		}
    	}
    	for(int i = 0;i <= sum;i++)ans = min(ans,f[n][i]);
    	printf("%d
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    PHPEXCEL使用实例
    php文件上传及mime类型大全
    此时无法停用连接。这个连接可能在用一个或多个不支持即插即用的协议,或者它是由其他用户或系统帐户初始化的。
    关于LineChart线条颜色和粗细的问题
    php读取excel类——PHPExcelReader
    windowsXP激活
    主机win7 虚拟机xp 不能上网的解决方案
    linux下载文件命令wget
    PHP 合并两个PDF成一个PDF文件利器 FPDI
    php 利用ExcelReader实现EXCEL转换成缓存
  • 原文地址:https://www.cnblogs.com/colazcy/p/11545410.html
Copyright © 2020-2023  润新知