【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\n" , ans);
	return 0;
}
时间: 2024-10-01 02:31:23

【bzoj1899】[Zjoi2004]Lunch 午餐 dp的相关文章

Bzoj1899: [Zjoi2004]Lunch 午餐

题面 传送门 Sol 首先显然吃饭久的要排在前面 之后再来分配队伍,设\(f[i][j]\)表示到第\(i\)个人,\(A\)队伍要等\(j\)的最小吃完饭时间 那么就是一个简单的背包吧... # include <bits/stdc++.h> # define RG register # define IL inline # define Fill(a, b) memset(a, b, sizeof(a)) # define Sqr(x) ((x) * (x)) using namespac

【BZOJ1899】[Zjoi2004]Lunch 午餐 贪心+DP

[BZOJ1899][Zjoi2004]Lunch 午餐 Description 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他们要吃的菜各有不同,打饭所要花费的时间是因人而异的.另外每个人吃饭的速度也不尽相同,所以吃饭花费的时间也是可能有所不同的. THU ACM小组的吃饭计划是这样的:先把所有的人分成两队,并安排好每队中各人的排列顺序,然后一号队伍到一号窗口去排

[bzoj 1899][ZJOI2004]lunch 午餐

Description 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他们要吃的菜各有不同,打饭所要花费的时间是因人而异的.另外每个人吃饭的速度也不尽相同,所以吃饭花费的时间也是可能有所不同的. THU ACM小组的吃饭计划是这样的:先把所有的人分成两队,并安排好每队中各人的排列顺序,然后一号队伍到一号窗口去排队打饭,二号队伍到二号窗口去排队打饭.每个人打完饭后立刻开

快手健康早午餐轻松做

快手健康早午餐轻松做 不用早起的工作日,睡一个小懒觉起来发现已经快到中午 拉开窗帘也是满满阳光洒进来,这样的好天气好心情索性做一顿brunch~ 快手又健康的橄榄油蔬菜配吐司,再喝点牛奶或咖啡,谁说工作日不能宠爱自己. 准备的食材很简单:你冰箱里剩下的所有蔬菜 我用的是青椒红椒和紫洋葱,还有一些生菜. 调味料:橄榄油,黑胡椒,盐.也可以准备一些沙拉酱 1:把食材都切成好入口的小丁备用 2:吐司烤脆,依据自己的口味来,有些人喜欢吃松软的吐司可以不用烤脆. 3:锅烧热倒入橄榄油 4:翻炒你的蔬菜丁加

练习你的听说读写能力

1. 练习听力 美国国家公共广播电台 NPR ( 请大家在百度搜索 "npr" ,搜索结果的首条就是 NPR ) . 特点:标准美式英语. 建议:每天花三十分钟左右,反复听英语广播,这是听力过关的必经之路.点击网页中左边“ BROWSE TOPICS ”下面的“ News ”选项.选择自己有兴趣的新闻链接,点开“ Listen Now ”左边的红色小喇叭图标,然后反复听该新闻的广播. 英国广播公司新闻频道 BBC ( 请大家在百度搜索 "news.bbc" ,搜索结

[No00005B]理解26个英文字母的原始含义-例词

理解26个英文字母的原始含义,不仅可以加强我们的语感,而且对我们背单词是大有帮助的.那么26个字母的象形之处到底在哪呢?下面是各字母所对应的含义,如果用示图表达出来,将会更加清楚. A-牛头 B-房子.鸟嘴 C,G-房角 D-门 E-举着双手的人 F-沙粒 H-荷花 I-手 K-皇帝 L-鞭子 M-水or波浪 N-鼻子 O-圆的东西 P-嘴 Q,R-人头 S-太阳,沙丘 T-十字架 V-龙 X-十字架 Z-闪电 A aa, an 一(个,件)(an 用于元音音素开头的词前) (3A1)a car

牛排与酒英语词汇

breakfast 早餐 lunch 午餐 brunch 早午餐 supper 晚餐 late snack 宵夜 dinner 正餐 ham and egg 火腿肠 buttered toast 奶油土司 French toast 法国土司 muffin松饼 cheese cake 酪饼 white bread 白面包 brown bread 黑面包 French roll 小型法式面包 appetizer 开胃菜 green salad 蔬菜沙拉 onion soup 洋葱汤 potage 法

words2

餐具:coffee pot 咖啡壶coffee cup 咖啡杯paper towel 纸巾napkin 餐巾table cloth 桌布tea -pot 茶壶tea set 茶具tea tray 茶盘caddy 茶罐dish 碟plate 盘saucer 小碟子rice bowl 饭碗chopsticks 筷子soup spoon 汤匙knife 餐刀cup 杯子glass 玻璃杯mug 马克杯picnic lunch 便当fruit plate 水果盘toothpick 牙签中餐:bear's

English trip -- VC(情景课)9 A Get ready

She is doing homwork He is doing laundry He is drying the dishes She is making lunch She is making the bed He is washing the dishes # 现在进行时 人称代词                                          Be动词             动词+ing形式 I