显然如果只有一个窗口,是一道贪心的题目,直接让吃饭慢的排在前面即可

两个窗口的话,我们还是根据这个原则

先对吃饭时间降序排序,然后这是一个dp

假如设当前处理到第i个人,当在窗口1的打饭时间确定了,窗口2的打饭时间也就知道了

我们用f[i,j]表示到第i个人,窗口1的打饭时间为j时的最快集合时间

然后dp搞一下就行了

 const inf=;
var a,b,s:array[..] of longint;
    f:array[..,..] of longint;
    n,i,j,ans:longint;
function max(a,b:longint):longint;
  begin
    if a>b then exit(a) else exit(b);
  end; function min(a,b:longint):longint;
  begin
    if a>b then exit(b) else exit(a);
  end; procedure swap(var a,b:longint);
  var c:longint;
  begin
    c:=a;
    a:=b;
    b:=c;
  end; procedure sort(l,r: longint);
  var i,j,x,y: longint;
  begin
    i:=l;
    j:=r;
    x:=a[(l+r) div ];
    repeat
      while a[i]>x do inc(i);
      while x>a[j] do dec(j);
      if not(i>j) then
      begin
        swap(a[i],a[j]);
        swap(b[i],b[j]);
        inc(i);
        j:=j-;
      end;
    until i>j;
    if l<j then sort(l,j);
    if i<r then sort(i,r);
  end; begin
  readln(n);
  for i:= to n do
    readln(b[i],a[i]);
  sort(,n);
  for i:= to n do
    s[i]:=s[i-]+b[i];
  for i:= to n do
    for j:= to s[n] do
      f[i,j]:=inf;
  f[,]:=;
  for i:= to n do
    for j:= to s[i-] do
    begin
      f[i,j]:=min(f[i,j],max(f[i-,j],s[i]-j+a[i]));  //排在窗口2
      f[i,j+b[i]]:=min(f[i,j+b[i]],max(j+b[i]+a[i],f[i-,j]));  //排在窗口1
    end;   ans:=inf;
  for i:= to s[n] do
    ans:=min(ans,f[n,i]);
  writeln(ans);
end.

bzoj1899的更多相关文章

  1. 【BZOJ1899】午餐(动态规划)

    [BZOJ1899]午餐(动态规划) 题面 BZOJ 题解 我太弱了 这种\(dp\)完全做不动.. 首先,感性理解一些 如果所有人都要早点走, 那么,吃饭时间长的就先吃 吃饭时间短的就晚点吃 所以, ...

  2. 【bzoj1899】[Zjoi2004]Lunch 午餐(贪心+dp)

    题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1899 显然为了节省时间,吃饭慢的人要先打饭.于是我们可以先把所有人按吃饭时间排序,于是 ...

  3. [BZOJ1899]Lunch 午餐(DP)

    [BZOJ1899] 首先有个很贪心的思路,吃饭时间长的最先打饭为最优,所以开始先排个序 然后考虑DP,我们不需要知道某个人在哪个对,只要关注总的时间就行了 肯定需要一维表示当前同学编号,还需要表示某 ...

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

    [BZOJ1899][Zjoi2004]Lunch 午餐 Description 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时 ...

  5. Bzoj1899: [Zjoi2004]Lunch 午餐

    题面 传送门 Sol 首先显然吃饭久的要排在前面 之后再来分配队伍,设\(f[i][j]\)表示到第\(i\)个人,\(A\)队伍要等\(j\)的最小吃完饭时间 那么就是一个简单的背包吧... # i ...

  6. [BZOJ1899][ZJOI2004]Lunch 午餐 (DP)

    比较水的DP 但是比较难想 整体思路还是很好理解的 在洛谷的题解里有一个一维的 > 什么时候去看一下 下面发我的代码 #include<bits/stdc++.h> #define ...

  7. luogu2577/bzoj1899 午餐 (贪心+dp)

    首先,应该尽量让吃饭慢的排在前面,先按这个排个序 然后再来决定每个人到底去哪边 设f[i][j]是做到了第i个人,然后1号窗口目前的总排队时间是j,目前的最大总时间 有这个i和j的话,再预处理出前i个 ...

  8. BZOJ1899或洛谷2577 [ZJOI2005]午餐

    BZOJ原题链接 洛谷原题链接 解决这题得先想到一个贪心:吃饭慢的先排队. 并不会证明(感觉显然 设\(f[i][j][k]\)表示已经排好了前\(i\)人,第一个队伍需要花费的打饭时间为\(j\), ...

  9. 【bzoj1899】[Zjoi2004]Lunch 午餐 dp

    题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他们要吃的菜各 ...

随机推荐

  1. PHP中刷新输出缓冲

    http://www.cnblogs.com/mutuan/archive/2012/03/18/2404957.html PHP中刷新输出缓冲buffer是一个内存地址空间,Linux系统默认大小一 ...

  2. Ext.Net学习笔记04:Ext.Net布局

    ExtJS中的布局功能很强大,常用的布局有border.accordion.fit.hbox.vbox等,Ext.Net除了将这些布局进行封装以外,更是对border进行了一些非常实用的改进,让我们来 ...

  3. iOS9 http不能访问网络——在Xcode中将https改成http方式

    =====================2016-01-29更新=========================== 最近做demo时,发现将https改成http方式略有小变 1. 没有改成ht ...

  4. Cell的重用机制

    static NSString *resuseId=@"cell"; UITableViewCell *cell=[tableView dequeueReusableCellWit ...

  5. scrapy shell 中文网站输出报错.记录.

    UnicodeDecodeError: 'gbk' codec can't decode bytes in position 381-382: illegal multibyte sequence 上 ...

  6. Linux消息队列

    #include <stdio.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/ms ...

  7. Ubuntu下VIM(GVIM)环境配置

    GVIM安装( Ubuntu自带VIM ): 通过应用商店安装或者通过以下安装. sudo apt-get install vim-gnome GVIM配置: 在 家目录 ( ~/ ) 下建立 .vi ...

  8. datatable 行列转换

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  9. javascript下动态this与动态绑定实例代码

    this 的值取决于 function 被调用的方式,一共有四种, 如果一个 function 是一个对象的属性,该 funtion 被调用的时候,this 的值是这个对象. 如果 function ...

  10. 【原创】Mvc学习笔记(1)

    1.新建MVC4项目 在MVC4中有App_Data文件夹,这个文件夹里可以放一些重要的数据,比如说数据库的mdf文件等等,这个文件夹非常安全,因为这个文件夹不允许被别人下载,不允许被浏览器访问. A ...