luogu2577[ZJOI2005]午餐

原创 2018年04月16日 18:46:31

题目链接
首先贪心,发现先把吃饭时间长的放在前面(证明略去)
如果吃饭时间相同,打饭时间少的放在前面
剩下部分一看就是一个背包,但直接开40000*40000爆空间和时间
考虑优化掉一维
用f[i][j] = k 表示前 i 个人在队伍 1 里正好花了 j 分钟的时候, 最早吃完的方法花了 k 分钟
这样就可以轻松过掉题目了

#include<bits/stdc++.h>
using namespace std;

const int N = 201;

struct ele {
    int a, b;
}a[N];

int f[N][N * N]; // f[i][j] = k 表示前 i 个人在队伍 1 里正好花了 j 分钟的时候, 最早吃完的方法花了 k 分钟 
int s[N];
int n;

inline bool operator < (const ele a, const ele b) {
    if(a.b > b.b) return 1;
    if(a.b < b.b) return 0;
    return a.a < b.a;
}

int main() {
    memset(f, 0x7f, sizeof(f));
    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);
    f[0][0] = 0, s[0] = 0;
    for(int i = 1; i <= n; i++) s[i] = s[i - 1] + a[i].a;
    int tmp = 0;
    for(int i = 1; i <= n; i++) {
        tmp += a[i].a;
        for(int j = tmp; j >= 0; j--) {
            if(j >= a[i].a) f[i][j] = max(f[i - 1][j - a[i].a], j + a[i].b);
            f[i][j] = min(f[i][j], max(f[i - 1][j], s[i] - j + a[i].b));
        }
    }
    int ans = 0x7fffffff;
    for(int i = 0; i <= tmp; i++) ans = min(ans, f[n][i]);
    printf("%d", ans);
    return 0;
}
/*

3
2 2
7 7
13 2

*/ 

但是这样不是最优,考虑滚动数组优化空间
现在的空间是n^3,优化到n^2
发现每一次决策只和上一个人有关,因此省去一维

#include<bits/stdc++.h>
using namespace std;

const int N = 201;

struct ele {
    int a, b;
}a[N];

int f[2][N * N]; // f[i][j] = k 表示前 i 个人在队伍 1 里正好花了 j 分钟的时候, 最早吃完的方法花了 k 分钟 
int s[N];
int n;

inline bool operator < (const ele a, const ele b) {
    if(a.b > b.b) return 1;
    if(a.b < b.b) return 0;
    return a.a < b.a;
}

int main() {
    memset(f, 0x7f, sizeof(f));
    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);
    f[0][0] = 0, s[0] = 0;
    for(int i = 1; i <= n; i++) s[i] = s[i - 1] + a[i].a;
    int tmp = 0;
    for(register int i = 1; i <= n; i++) {
        tmp += a[i].a;
        for(register int j = tmp; j >= 0; j--) {
            f[i % 2][j] = 0x7f7f7f7f;
            if(j >= a[i].a) f[i % 2][j] = max(f[(i - 1) % 2][j - a[i].a], j + a[i].b);
            f[i % 2][j] = min(f[i % 2][j], max(f[(i - 1) % 2][j], s[i] - j + a[i].b));
        }
    }
    int ans = 0x7fffffff;
    for(int i = 0; i <= tmp; i++) ans = min(ans, f[n % 2][i]);
    printf("%d", ans);
    return 0;
}
/*

3
2 2
7 7
13 2

*/ 

[BZOJ 1899] ZJOI 2004 Lunch 午餐 · 动态规划

按吃饭时间降序排序,然后动归,状态想到了就很简单了。 #include #include #include #include using namespace std; const int ...
  • ycdfhhc
  • ycdfhhc
  • 2015年08月12日 08:10
  • 926

【BZOJ】【P1899】【ZJOI2004】【Lunch 午餐】【题解】【DP】

传送门:www.lydsy.com/JudgeOnline/problem.php?id=1899 其实这是zjoi2005
  • u012732945
  • u012732945
  • 2014年05月31日 21:29
  • 1180

1899: [Zjoi2004]Lunch 午餐

题目链接题目大意:有n个人,2个窗口,每个人有固定的吃饭和打饭时间,到1窗口和2窗口的打饭时间和吃饭时间都是一样的,问所有人吃完饭的最早时间题解:如果只有一个窗口的话就是蓝书第一章某贪心例题,按照吃饭...
  • Mmh2000
  • Mmh2000
  • 2017年08月22日 14:05
  • 158

洛谷P2577 [ZJOI2005]午餐

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

【贪心+DP】BZOJ1899(Zjoi2004)[Lunch 午餐]题解

BZOJ1899题解。
  • zzkksunboy
  • zzkksunboy
  • 2017年05月22日 21:37
  • 664

BZOJ 1898: [Zjoi2005]Swamp 沼泽鳄鱼

邻接矩阵求路线数 特殊性在于周期,不过求下LCM还是可以搞的。 可以发现图是周期变化的,以12为一周期,于是建13个邻接矩阵,第13个为前12个的乘积,于是有G(K)=(G(13))^(k/12)...
  • nlj1999
  • nlj1999
  • 2016年03月21日 09:43
  • 399

[ZJOI2005]午餐

题目 https://www.luogu.org/recordnew/show/6087909 思路 显然成立的是吃饭时间越长的越早打饭,so,果断排序! dp嘛。。。 f[i][j]表...
  • Eric1561759334
  • Eric1561759334
  • 2018年03月08日 13:05
  • 25

【LuoguP2577】[ZJOI2005]午餐

题目链接 题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂。这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭。由于每个人的口味(以及胃口)不同,...
  • element_hero
  • element_hero
  • 2018年02月27日 21:10
  • 12

P2577 [ZJOI2005]午餐

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

[ZJOI2005]午餐 贪心+dp

这个题如果直接dp的话要考虑 先从题目类型入手,这种规划性问题 应该是个dp 1开始的时间、1结束的时间、2开始的时间、2结束的时间 这是200^6级别的状态数,且没有任何状态优化的余地 所以...
  • haobang866
  • haobang866
  • 2017年12月19日 21:55
  • 50
收藏助手
不良信息举报
您举报文章:luogu2577[ZJOI2005]午餐
举报原因:
原因补充:

(最多只允许输入30个字)