[bzoj 1899][ZJOI2004]lunch 午餐

Description

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

Input

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

Output

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

Sample Input

5
2 2
7 7
1 3
6 4
8 5

Sample Output

17

HINT

方案如下:

窗口1: 窗口2:
7 7 1 3
6 4 8 5
2 2

【限制】
所有输入数据均为不超过200的正整数。

Source

题解

这题没有自己想出来QAQ

事实上如果只有一个窗口那就是经典贪心题,对吃饭时间进行排序,吃饭时间长的先打饭(因为总的打饭时间是一定的)

先保留上面的想法,想想其他做法

我们可以设$f[i][j][k]$表示前i个人在1窗口打饭时间为j,在2窗口打饭为k的最优解

但是j和k这两维都得开到40000(200*200)

考虑优化空间。发现只要对打饭时间维护一个前缀和,那么就可以只保存一个时间了,另外一个时间则是$sum[i]-j$

考虑转移(方程里面的c[i]是前缀和)

对于在1窗口打饭的情况:$f[i][j]=min(f[i][j],max(f[i-1][j-a[i].x],j+a[i].y))$

对于在2窗口打饭的情况:$f[i][j]=min(f[i][j],max(f[i-1][j],c[i]-j+a[i].y))$

那么最优解就是在$f[n][1...c[n]]$里面找了

#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

struct node {
    int x,y;
}a[300];

int h1,h2,n;
int c[300],f[300][40000];
//f[i][j]表示前i个人时其中一个队伍打饭时间为j的最优解
//c数组维护前缀和 

bool cmp(node a,node b){
    return a.y>b.y;
}

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d%d",&a[i].x,&a[i].y);
    }

    memset(f,0x3f,sizeof(f));
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;i++)c[i]=c[i-1]+a[i].x;

    f[0][0]=0;
    for(int i=1;i<=n;i++){
        for(int j=0;j<=c[i];j++){
            f[i][j]=min(f[i][j],max(f[i-1][j],c[i]-j+a[i].y));
            //在另外一个窗口吃
            if(j-a[i].x>=0)f[i][j]=min(f[i][j],max(f[i-1][j-a[i].x],j+a[i].y));
            //在当前窗口吃
        }
    }

    int ans=0x3f3f3f3f;
    for(int i=0;i<=c[n];i++){
        ans=min(ans,f[n][i]);
    }
    printf("%d\n",ans);

    return 0;
}

原文地址:https://www.cnblogs.com/henry-1202/p/9567319.html

时间: 2024-07-30 15:36:31

[bzoj 1899][ZJOI2004]lunch 午餐的相关文章

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

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

【bzoj1899】[Zjoi2004]Lunch 午餐 dp

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

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

矩阵乘法专题3——bzoj 1898 [Zjoi2004]Swamp 沼泽鳄鱼 题解

[原题] 1898: [Zjoi2004]Swamp 沼泽鳄鱼 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 425  Solved: 256 [Submit][Status] Description 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎然,引来不少游客.为了让游玩更有情趣,人们在池塘的中央建设了几座石墩和石桥,每座石桥连接着两座石墩,且每两座石墩之间至多只有一座石桥.这

快手健康早午餐轻松做

快手健康早午餐轻松做 不用早起的工作日,睡一个小懒觉起来发现已经快到中午 拉开窗帘也是满满阳光洒进来,这样的好天气好心情索性做一顿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