博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【bzoj1899】[Zjoi2004]Lunch 午餐 dp
阅读量:5155 次
发布时间:2019-06-13

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

题目描述

上午的训练结束了,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 
#include
#include
#define N 210using 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;}

 

 

转载于:https://www.cnblogs.com/GXZlegend/p/7491612.html

你可能感兴趣的文章
Python基础(8)素数输出
查看>>
POS Tagging 标签类型查询表(Penn Treebank Project)
查看>>
Cookie/Session机制详解
查看>>
sklearn 数据预处理1: StandardScaler
查看>>
搭建Docker环境---Docker概述
查看>>
NOI 08 石头剪刀布
查看>>
UVa 11383 少林决胜(二分图最佳完美匹配)
查看>>
Ural 1297 Palindrome(后缀数组+最长回文子串)
查看>>
了解java虚拟机—非堆相关参数设置(4)
查看>>
mysql find_in_set
查看>>
数组的去重-----------------------来自大牛的讲解
查看>>
NSAttributedString
查看>>
Java复习之网络编程
查看>>
C#与vb6 com组件的互相调用方法
查看>>
对象-关系映射ORM(Object Relational Mapping)(转)
查看>>
ISP DSP的不同
查看>>
深入Linux grep指令的详解(实用型)
查看>>
嵌入式根文件系统的移植和制作详解
查看>>
单片机定时器中断原理
查看>>
Ignite 配置更新Oracle JDBC Drive
查看>>