BZOJ 1672 Usaco 2005 Dec Cleaning Shifts 清理牛棚 动态规划

来源:互联网 发布:小米手机数据连接不上 编辑:程序博客网 时间:2024/05/22 01:44

题目大意:有一些牛,他们的牛舍需要被打扫。有N(N <= 10000)头牛愿意打扫,从时间S到时间T,需要花费一些金钱。问若要每时每刻都有牛在打扫,至少需要花多少钱。


思路:1w的数据量不算很大,再加上时限5s,就n^2动归来做。

将牛按时间段的开始排序。

设f[i]为若取第i头牛打扫,到这头牛结束的时间最小花费是多少。

则    f[i] = min(f[i],f[j] + cost[i])  (f[i].st <= f[j].ed + 1)

最后是初值和答案的问题。由于题目中说每时每刻都有牛在打扫,所以f的初值为极大值,在要求开始之前就开始了的牛的初值是这个牛的花费。

动归时更新答案,若要求结束的时候这头牛还在工作,那么就用这头牛更新答案。最后输出答案。


CODE:


#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define MAX 10010#define INF 0x3f3f3f3fusing namespace std;struct Complex{    int x,y;    int cost;    bool operator <(const Complex &a)const {        if(x != a.x)            return x < a.x;        return y < a.y;    }    void Read() {        scanf("%d%d%d",&x,&y,&cost);        x++,y++;    }}src[MAX];int cnt,st,ed;int f[MAX];int main(){    cin >> cnt >> st >> ed;    st++,ed++;    for(int i = 1;i <= cnt; ++i)        src[i].Read();    sort(src + 1,src + cnt + 1);    memset(f,0x3f,sizeof(f));    int ans = INF;    for(int i = 1;i <= cnt; ++i)        if(src[i].x <= st)            f[i] = src[i].cost;    for(int i = 1;i <= cnt; ++i)        for(int j = 0;j < i; ++j)            if(src[i].x <= src[j].y + 1) {                f[i] = min(f[i],f[j] + src[i].cost);                if(src[i].y >= ed)  ans = min(ans,f[i]);            }    if(ans == INF)  ans = -1;    cout << ans << endl;    return 0;}


0 0
原创粉丝点击