老早的一道水题

题意:

上午的训练结束了,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. Centos下新建用户及修改用户目录

    Centos下新建用户及修改用户目录 Hillgo 关注 2015.09.22 01:32* 字数 154 阅读 3492评论 0喜欢 3 添加及删除用户 添加用户 test: adduser tes ...

  2. Socket 连接建立过程

    阻塞模式下: 1,客户端向服务器端发起请求建立连接时,服务器端只需要运行到 serverSocket = ); 客户端注册的  SelectionKey.OP_CONNECT 事件就能够发生. 也就是 ...

  3. oracle数据库还原以及备份 包括快速备份(并发压缩)

    expdp jhpt/XXXX directory=databackup dumpfile=dpfile_201512091300_%U.dmp filesize=5G parallel=8 comp ...

  4. Linux - rm 修复误删文件

    fdisk -l # 分区信息lsblk -f # 查看文件类型/etc/fstab # 查看文件格式挂载启动信息 # debugfs针对 ext2 # ext3grep针对 ext3 # extun ...

  5. Linux之Ubuntu与Windows更改默认启动顺序[转载]

    装双系统后,经常会遇到与Windows更改默认启动顺序的需要,这样有助于开机时可以避免手动选择经常使用的系统了. 当然这解决办法不是博主的主意,本文纯属抄録者,故文章题目也声明了是转载,解决方案如下叙 ...

  6. Java SE之向上转型与向下转型

    package object; //向上转型-向下转型 public class Up_Down_convert { /* 向上转型 * * 1.上转型对象可以使用和操作子类继承或者重写的方法 * 2 ...

  7. luogu P2726 [SHOI2005]树的双中心

    传送门 强行安利->巨佬题解 如果只有一个点贡献答案,那么答案显然是这棵树的带权重心,这个是可以\(O(n)\)求的.一个\(O(n^2)\)暴力是枚举两个集合之间的分界边,然后对这两个集合分别 ...

  8. luogu P2502 [HAOI2006]旅行

    传送门 边数只有5000,可以考虑\(O(m^2)\)算法,即把所有边按边权升序排序,然后依次枚举每条边\(i\),从这条边开始依次加边,加到起点和终点在一个连通块为止.这个过程可以用并查集维护.那么 ...

  9. 第18月第22天 机器学习first

    1.网易公开课 机器学习   http://open.163.com/special/opencourse/machinelearning.html https://github.com/search ...

  10. python - 计算器 程序练习

    v1.0 计算器(数据内不含括号方式:) import re def jisuan(a,b,c): sun_count = 0 if c =="+": sun_count = st ...