老早的一道水题

题意:

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

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

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

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

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

数据范围:

所有输入均小于100

题解:

首先能发现这题给了两个队伍很容易想到dp

但发现人的顺序不知道,思考一下能发现这显然是一个贪心,将吃饭吃的慢的人排在前面

之后就可以dp了,用f[i,j,k]表示第i个人,第1条队伍等待时间为j,第二条队伍等待时间为k,所需的最少结束时间

但发现这是超时的

优化很简单,考虑前缀和sum[i]=j+k,所以只需记录其中一维即可

代码:

#include <bits/stdc++.h>
using namespace std;
#define INF 99999999
struct re{int a,b;}a[];
bool cmp(re a,re b)
{
return(a.b>b.b);
};
int n,m,f[][],sum[];
int main(){
freopen("noip.in","r",stdin);
freopen("noip.out","w",stdout);
cin>>n;
for (int i=;i<=n;i++)
cin>>a[i].a>>a[i].b;
sort(a+,a+n+,cmp);
for (int i=;i<=n;i++)
sum[i]=sum[i-]+a[i].a;
for (int i=;i<=;i++)
for (int j=;j<=;j++)
f[i][j]=INF;
f[][]=;
for (int i=;i<=n;i++)
for (int j=;j<=sum[i];j++)
{
if (j>=a[i].a) f[i][j]=min(f[i][j],max(f[i-][j-a[i].a],j+a[i].b));
if (sum[i]-j>=a[i].a) f[i][j]=min(f[i][j],max(f[i-][j],sum[i]-j+a[i].b));
}
int minn=INF;
for (int i=;i<=sum[n];i++)
minn=min(minn,f[n][i]);
cout<<minn;
return();
}

BZOJP1899ZJOI2004的更多相关文章

随机推荐

  1. vscode插件和快捷键

    目前用的挺多的一些编辑器有webstorm,vscode,Atom,HBuilder等等 今天来说说vscode Visual Studio Code (简称 vscode) 是一款免费开源的现代化轻 ...

  2. JavaScript之柯里化

    //未柯里化 function add(a,b){ return a + b; } //柯里化 function add(y){ return function(x){ console.log(y + ...

  3. Java EE之Hibernate异常总结【5】java.lang.StackOverflowError[栈溢出]

    Exception in thread "main" java.lang.StackOverflowError at java.lang.reflect.InvocationTar ...

  4. Mask RCNN 学习笔记

    下面会介绍基于ResNet50的Mask RCNN网络,其中会涉及到RPN.FPN.ROIAlign以及分类.回归使用的损失函数等 介绍时所采用的MaskRCNN源码(python版本)来源于GitH ...

  5. Linux系统调用的运行过程【转】

    本文转自:http://blog.csdn.net/kernel_learner/article/details/7331505 在Linux中,系统调用是用户空间访问内核的唯一手段,它们是内核唯一的 ...

  6. 【转】C++ map的基本操作和使用

    1.map简介 map是一类关联式容器.它的特点是增加和删除节点对迭代器的影响较小,除了那个操作节点,对其它的节点都没有什么影响.对于迭代器来说,可以修改实值,而不能修改key. 2.map的功能 自 ...

  7. 为cobbler自动化安装系统工具添加epel源

    关于cobbler的安装及部署,参考:CentOS 6.5自动化运维之基于cobbler服务的自动化安装操作系统详解http://blog.csdn.net/reblue520/article/det ...

  8. centos6下通用二进制安装mysql5.5.33

    mysql5.5通用二进制格式安装方法 1.解压到 /usr/local 目录 # tar xf mysql-5.5.33-linux2.6-x86_64.tar.gz -C /usr/local 2 ...

  9. Ex 6_16 旧货销售问题_第七次作业

    即可 子问题定义:定义数组B(S,j),其中 B(S,j)表示在子集S中结束位置为j的子问题的最大收益值,其中j的前一个地点有两种情况,第一种情况是某个拍卖会 另一种情况是从家里出发. 递归关系: 初 ...

  10. Jquery hover方法使用及 mouseenter与mouseleave和 mouseover与mouseout的区别

    定义和用法 hover() 方法规定当鼠标指针悬停在被选元素上时要运行的两个函数. jQuery 1.7 版本前该方法触发 mouseenter 和 mouseleave 事件. jQuery 1.8 ...