博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[ZJOI2005]午餐 (贪心,动态规划)
阅读量:5237 次
发布时间:2019-06-14

本文共 1626 字,大约阅读时间需要 5 分钟。

题目描述

上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂。这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭。由于每个人的口味(以及胃口)不同,所以他们要吃的菜各有不同,打饭所要花费的时间是因人而异的。另外每个人吃饭的速度也不尽相同,所以吃饭花费的时间也是可能有所不同的。

THU ACM小组的吃饭计划是这样的:先把所有的人分成两队,并安排好每队中各人的排列顺序,然后一号队伍到一号窗口去排队打饭,二号队伍到二号窗口去排队打饭。每个人打完饭后立刻开始吃,所有人都吃完饭后立刻集合去六教地下室进行下午的训练。

现在给定了每个人的打饭时间和吃饭时间,要求安排一种最佳的分队和排队方案使得所有人都吃完饭的时间尽量早。

假设THU ACM小组在时刻0到达十食堂,而且食堂里面没有其他吃饭的同学(只有打饭的师傅)。每个人必须而且只能被分在一个队伍里。两个窗口是并行操作互不影响的,而且每个人打饭的时间是和窗口无关的,打完饭之后立刻就开始吃饭,中间没有延迟。

现在给定N个人各自的打饭时间和吃饭时间,要求输出最佳方案下所有人吃完饭的时刻。

输入输出格式

输入格式:

第一行一个整数N,代表总共有N个人。

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

输出格式:

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

输入输出样例

输入样例#1:

5

2 2
7 7
1 3
6 4
8 5

输出样例#1:

17

说明

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

Solution

考虑贪心.

给出贪心条件证明:
令当前,有两个人分别为 a,b,且满足 a 在 b 前为更优解.
排队和吃饭时间分别为:
\[d_a,c_a,d_b,c_b\]
那么当前如果 a 在 b前,所需要花费的时间即为:
\[d_a+max(c_a,d_b+c_b)\]

同理,如果 b 在 a 前,所需花费的时间为:

\[d_b+max(c_b,d_a+c_a)\]

因为满足 a 在 b 前条件更优,即满足关系:

\[d_a+max(c_a,d_b+c_b)<d_b+max(c_b,d_a+c_a)\]
以上贪心是一列队的做法,对于两列,考虑DP.
定义状态:
\[f[i][j]\]
表示到了第 i 个人,第1队打饭时间 (不包括吃饭)为 j 时的最小集合时间.

转移方程

对于第 i 个人,它有两种情况.
1) 去第一队
\[f[i+1][j+a[i+1].w]=min(f[i+1][j+a[i+1].d],max(j+a[i+1].d+a[i+1].c,f[i][j]));\]
2) 去第二队
\[f[i+1][j]=min(f[i+1][j],max(f[i][j],a[i+1].c+sum[i]-j+a[i+1].d));\]

其中 sum 代表排序之后的排队前缀和.

#include
using namespace std;const int maxn=208;struct sj{ int c; int d;}a[maxn];bool cmp(sj s,sj j){return s.d+max(s.c,j.c+j.d)
>n; for(int i=1;i<=n;i++) cin>>a[i].d>>a[i].c; sort(a+1,a+n+1,cmp); for(int i=1;i<=n;i++) sum[i]=sum[i-1]+a[i].d; memset(f,127,sizeof(f)); int inf=f[0][0]; f[0][0]=0; for(int i=0;i

转载于:https://www.cnblogs.com/Kv-Stalin/p/9193539.html

你可能感兴趣的文章
java并发值多线程同步业务场景以及解决方案
查看>>
Android开发——LinearLayout和RelativeLayout的性能对比
查看>>
URL传递中文参数,大坑一枚,Windows与Linux效果竟然不一致(两种解决方法)
查看>>
百度UEditor上传图片-再总结一次
查看>>
Redis集群
查看>>
uwsgi基础——服务状态
查看>>
python引入模块
查看>>
初识dubbo(一)
查看>>
没加载redis类,却可以实例化redis
查看>>
软链接mongo
查看>>
时间戳转换
查看>>
hdu 4044 树形DP 炮台打怪 (好题)
查看>>
HDU3336 - Count the string
查看>>
VS2017提醒找不到MSVCR110D.dll
查看>>
[转][Java]简单标签库简介
查看>>
20145206邹京儒 web安全基础实践
查看>>
【python 3.6】如何将list存入txt后,再读出list
查看>>
百度地图API
查看>>
Android实现静默安装与卸载
查看>>
WPF:警惕TextBox会占用过多内存
查看>>