[USACO Nov07] 挤奶时间
时间限制:1 s 内存限制:128 MB
译 By CmYkRgB123
描述
贝茜是一只非常努力工作的奶牛,她总是专注于提高自己的产量。为了产更多的奶,她预计好了接下来的N (1 ≤ N ≤ 1,000,000)个小时,标记为0..N-1。
Farmer John 计划好了 M (1 ≤ M ≤ 1,000) 个可以挤奶的时间段。每个时间段有一个开始时间(0 ≤ 开始时间 ≤ N), 和一个结束时间 (开始时间 < 结束时间 ≤ N), 和一个产量 (1 ≤ 产量 ≤ 1,000,000) 表示可以从贝茜挤奶的数量。Farmer John 从分别从开始时间挤奶,到结束时间为止。每次挤奶必须使用整个时间段。
但即使是贝茜也有她的产量限制。每次挤奶以后,她必须休息 R (1 ≤ R ≤ N) 个小时才能下次挤奶。给定Farmer John 计划的时间段,请你算出在 N 个小时内,最大的挤奶的量。
输入
第 1 行: 三个整数 N, M, R
第 2..M+1 行: 第 i+1 行 每行三个整数,为Farmer John挤奶计划的开始时间,结束时间,产量。
输出
第 1 行:一个整数 在 N 个小时内,最大的挤奶的量.
样例输入
12 4 2
1 2 8
10 12 19
3 6 24
7 10 31
样例输出
43
被这道逗逼题坑了,权且记录一下
n^2 DP
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
struct point {
int l, r, dis;
} a[1001];
int n, m, t, f[1001];
int cmp(const point &c, const point &d) {
return c.r < d.r;
}
int main() {
freopen("milkprod.in", "r", stdin);
freopen("milkprod.out", "w", stdout);
scanf("%d%d%d", &n, &m, &t);
for (int i = 1; i <= m; ++i)
scanf("%d%d%d", &a[i].l, &a[i].r, &a[i].dis);
sort(a + 1, a + m + 1, cmp);
a[0].r = -99999999;
for (int i = 1; i <= m; ++i)
for (int j = 0; j < i; ++j)
if (a[j].r + t <= a[i].l)
f[i] = max(f[i - 1], f[j] + a[i].dis);
printf("%d", f[m]);
}