正解:序列dp

解题报告:

传送门!

这题首先要想到一个显然的贪心:每个窗口的排队顺序都是按照吃饭时间从大到小排序的

证明如下:

这种贪心通常都是用微扰法,这题也不例外

现在假如已经确定了每个窗口有哪些人辣,那就是要排除最优顺序使得吃完饭的时间最短

因为两个窗口直接互不影响,所以可以先单独抽出一个窗口来看,就相当于只有一个窗口了

然后选取两个人x,y,设a表示排队时间b表示吃饭时间,令b[x]>b[y]

于是可以列出式子

对于x排在前面,T1=a[x]+max(b[x],a[y]+b[y])

对于y排在前面,T2=a[y]+max(b[y],a[x]+b[x])

因为已经令b[x]>b[y]辣,所以T2=a[y]+a[x]+b[x]

所以T1-T2=max(b[x],a[y]+b[y])-a[y]-b[x]

当b[x]>a[y]+b[y]时,T1-T2=-a[y]<0,T1<T2

当b[x]<a[y]+b[y]时,T1-T2=b[y]-b[x]<0,T1<T2

综上,当x排在前面是T1<T2

所以按照吃饭时间顺序从大到小排是最优的

然后得到了这个贪心之后就变成,已知排队顺序,有两个窗口,求怎么安排时间最小

显然是设f[i][j]:排到第i个人辣一号窗口的排队时间为j的最小吃饭时间

然后记个前缀和sum可以求出二号窗口的排队时间嘛

然后转移就一样是分类讨论走一波就欧克了鸭

还是大概港下QwQ

首先可以到一号窗口,然后到了一号窗口之后有两个情况

第一个是前面的人吃完饭的时间比第i个人的吃饭时间还要长,那就f[i][j+a[i]]=f[i-1][j]

第二个是前面的人吃完饭的时间比第i个人的吃饭时间短一些,那就f[i][j+a[i]]=j+a[i]+b[i]

当然实际上是不用分类讨论的取个max就好QwQ

然后也可以到二号窗口,一样的两个情况一样的思路,懒得详细写辣,反正就max(f[i-1][j],sum[i]-j+a[i]+b[i])

然后放下代码,,,

这个代码是我5个月之前写的辣,,,其实码风差不多,就麻油快读,麻油压行,然后代码里的变量名有点不一样,但思路理顺辣看代码还是比较轻松的辣QwQ所以我就懒得改辣QwQ

over!

#include<bits/stdc++.h>
using namespace std;
][],sum[];
struct str
{
    int d,e;
}a[];
bool cmp(str x,str y)
{
    return x.e>y.e;
}
int main()
{
    cin>>n;
    ;i<=n;i++)cin>>a[i].d>>a[i].e;
    sort(a+,a+n+,cmp);
    ;i<=n;i++)sum[i]=sum[i-]+a[i].d;
    ;i<=n;i++)
        ;j<=sum[n];j++)f[i][j]=;
    ;
    f[][]=;
    ;i<=n;i++)
        ;j<=sum[i];j++)
        {
            ][j-a[i].d],j+a[i].e));
            f[i][j]=min(f[i][j],max(f[i-][j],sum[i]-j+a[i].e));
        }
    ;j<=sum[n];j++)ans=min(ans,f[n][j]);
    cout<<ans;
    ;
}

洛谷P2577 [ZJOI2005]午餐 dp的更多相关文章

  1. 洛谷P2577 [ZJOI2005]午餐 打饭时间作为容量DP

    P2577 [ZJOI2005]午餐 )逼着自己做DP 题意: 有n个人打饭,每个人都有打饭时间和吃饭时间.有两个打饭窗口,问如何安排可以使得总用时最少. 思路: 1)可以发现吃饭时间最长的要先打饭. ...

  2. 【题解】洛谷P2577 [ZJOI2005] 午餐(DP+贪心)

    次元传送门:洛谷P2577 思路 首先贪心是必须的 我们能感性地理解出吃饭慢的必须先吃饭(结合一下生活) 因此我们可以先按吃饭时间从大到小排序 然后就能自然地想到用f[i][j][k]表示前i个人在第 ...

  3. [洛谷P2577] [ZJOI2005]午餐

    洛谷题目链接:[ZJOI2005]午餐 题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的 ...

  4. 洛谷 P2577 [ZJOI2005]午餐

    这道题目比较难想. 题解: 算法:贪心+dp 容易想到贪心:吃饭慢的先打饭节约时间, 所以先将人按吃饭时间从大到小排序. 然后就是dp了: 首先,应该想到f[i][j][k]:前i个人,在1号窗口打饭 ...

  5. 洛谷 P2577 [ZJOI2005]午餐 题解

    每日一题 day56 打卡 Analysis 算法:贪心+dp 容易想到贪心:吃饭慢的先打饭节约时间, 所以先将人按吃饭时间从大到小排序. 然后就是dp了: 首先,应该想到f[i][j][k]:前i个 ...

  6. Luogu P2577 [ZJOI2005]午餐(dp)

    P2577 [ZJOI2005]午餐 题面 题目描述 上午的训练结束了, \(THU \ ACM\) 小组集体去吃午餐,他们一行 \(N\) 人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时 ...

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

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

  8. 洛谷 2577 [ZJOI2005]午餐——序列dp

    题目:https://www.luogu.org/problemnew/show/P2577 可以从只有一个窗口的角度思考出一个贪心结论.就是应当按吃饭时间(不算打饭时间)从大到小排序.这样交换相邻两 ...

  9. P2577 [ZJOI2005]午餐[DP]

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

随机推荐

  1. c++的字节对齐

    win32平台下的微软C编译器对齐策略: 1)结构体变量的首地址能够被其最宽数据类型成员的大小整除.编译器在为结构体变量开辟空间时,首先找到结构体中最宽的数据类型,然后寻找内存地址能被该数据类型大小整 ...

  2. 脚本学习 game.sh

    #!/bin/bash #game_error.sh ]]; then #$#表示参数个数 -lt小于 echo "Usage: game_error.sh time[20170710]&q ...

  3. Qt+imx6编写的楼宇对讲管理平台

    第一个初步版本. 1:楼宇对讲模块.住户报警模块.门禁控制模块.系统设置模块. 2:实时对讲信息卡片式展示,通话记录表格展示. 3:设备面板展示,实时显示上下线报警等信息. 4:设备查询.记录查询.运 ...

  4. MFC onpaint() ondraw()

    OnPaint是WM_PAINT消息的消息处理函数,在OnPaint中调用OnDraw,一般来说,用户自己的绘图代码应放在OnDraw中. OnPaint()是CWnd的类成员,负责响应WM_PAIN ...

  5. C#生成随机验证码例子

    C#生成随机验证码例子: 前端: <tr> <td width=" align="center" valign="top"> ...

  6. Word 2010 制作文档结构之图标自动编号设置

    注意: 使用图片自动编号时,如果文档标题使用的样式是通过“将所选内容保存为新快速样式”所生成的样式,则图片自动编号不会生效 因此设置标题样式时,不要 新建样式,直接使用word预设的“标题 1”样式和 ...

  7. 最小生成树(prime算法 & kruskal算法)和 最短路径算法(floyd算法 & dijkstra算法)

    一.主要内容: 介绍图论中两大经典问题:最小生成树问题以及最短路径问题,以及给出解决每个问题的两种不同算法. 其中最小生成树问题可参考以下题目: 题目1012:畅通工程 http://ac.jobdu ...

  8. PostgreSQL9.4如何指定数据库schema

    在PostgreSQL中数据库可以有多个schema,在程序访问的时候如果不做特殊的设置,默认连接的是名为public的schema. 那么,如何设置能够让程序去访问特定的schema呢?之前在网上找 ...

  9. Laya 图集动画

    参考: 图集动画运用 一.准备素材 从爱给网找到几个素材 二.使用Laya的图集工具 菜单栏选择工具->图集打包工具,然后选择序列图所在的文件夹 生成了个.rec...说好的.atlas呢... ...

  10. 深入浅出WPF之Binding的使用(二)

    在上一篇中介绍了Binding的基本绑定方法,这一篇中我们在深入的介绍Binding的其他用法. Binding的源也就是数据的源头,在日常的工作中,除了使用像上一篇中的Student对象作为数据源外 ...