zoukankan      html  css  js  c++  java
  • BZOJ 1899: [Zjoi2004]Lunch 午餐

    Description

    上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂。这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭。由于每个人的口味(以及胃口)不同,所以他们要吃的菜各有不同,打饭所要花费的时间是因人而异的。另外每个人吃饭的速度也不尽相同,所以吃饭花费的时间也是可能有所不同的。 THU ACM小组的吃饭计划是这样的:先把所有的人分成两队,并安排好每队中各人的排列顺序,然后一号队伍到一号窗口去排队打饭,二号队伍到二号窗口去排队打饭。每个人打完饭后立刻开始吃,所有人都吃完饭后立刻集合去六教地下室进行下午的训练。 现在给定了每个人的打饭时间和吃饭时间,要求安排一种最佳的分队和排队方案使得所有人都吃完饭的时间尽量早。 假设THU ACM小组在时刻0到达十食堂,而且食堂里面没有其他吃饭的同学(只有打饭的师傅)。每个人必须而且只能被分在一个队伍里。两个窗口是并行操作互不影响的,而且每个人打饭的时间是和窗口无关的,打完饭之后立刻就开始吃饭,中间没有延迟。 现在给定N个人各自的打饭时间和吃饭时间,要求输出最佳方案下所有人吃完饭的时刻。

    Input

    第一行一个整数N,代表总共有N个人。 以下N行,每行两个整数 Ai,Bi。依次代表第i个人的打饭时间和吃饭时间。

    Output

    一个整数T,代表所有人吃完饭的最早时刻。

    Sample Input

    5
    2 2
    7 7
    1 3
    6 4
    8 5

    Sample Output

    17

    HINT

    方案如下:

    窗口1: 窗口2:
    7 7 1 3
    6 4 8 5
    2 2

    【限制】
    所有输入数据均为不超过200的正整数。

    这个DP的思路还是挺巧妙的

    方程一定要有表示时间的,f[i][j][k]表示第i个人,一号窗口打饭时间为j,另一个为k

    开不下,考虑优化,k实质上等于打饭时间前缀和减掉 j ,消掉1维

    还有个贪心:肯定是吃饭磨磨唧唧的人先打饭

    代码如下:

    //MT_LI
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    using namespace std;
    int n;
    struct dinner{
        int a,b;
    }a[210];
    bool cmp(dinner a,dinner b){return a.b>b.b;}
    int s[210];
    int f[210][41000];//1个窗口等待时间为j,第i个人去哪 
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%d%d",&a[i].a,&a[i].b);
        sort(a+1,a+n+1,cmp);
        for(int i=1;i<=n;i++)s[i]=s[i-1]+a[i].a;
        memset(f,63,sizeof(f));f[0][0]=0;
        for(int i=1;i<=n;i++) 
            for(int j=0;j<=s[i];j++)
            { 
                f[i][j]=min(f[i][j],max(f[i-1][j],s[i]-j+a[i].b)); 
                if(j>=a[i].a)f[i][j]=min(f[i][j],max(f[i-1][j-a[i].a],j+a[i].b));
            }
        int ans=0x7fffff;
        for(int i=0;i<=s[n];i++)ans=min(ans,f[n][i]);
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    servlet-servletConfig
    servlet-servletContext网站计数器
    servlet-cookie
    Android 无cp命令 mv引起cross-device link
    android使用mount挂载/system/app为读写权限,删除或替换系统应用
    android使用百度地图、定位SDK实现地图和定位功能!(最新、可用+吐槽)
    解决android sdk manager无法下载SDK 的问题
    Android APK反编译详解(附图)
    Android如何防止apk程序被反编译
    不用外部JAR包,自己实现JSP文件上传!
  • 原文地址:https://www.cnblogs.com/MT-LI/p/9904014.html
Copyright © 2011-2022 走看看