BZOJ 1642: [Usaco2007 Nov]Milking Time 挤奶时间

来源:互联网 发布:最高人民法院网络拍卖 编辑:程序博客网 时间:2024/04/28 14:02

根据开始时间排序后dp
f[i]表示第i头奶牛挤奶结束之后的最大挤奶量

f[i]=max{f[j]+out[i]}

其中
time[j].end+rtime[i].start

r就是挤奶的间隔
最后
ans=max{f[i]}

嗯挺简单的吧

#include<bits/stdc++.h>#define g getchar()#define ll long long#define inf 0x3f3f3f3fusing namespace std;inline ll read(){    ll x=0,f=1;char ch=g;    for(;ch<'0'||ch>'9';ch=g)if(ch=='-')f=-1;    for(;ch>='0'&&ch<='9';ch=g)x=x*10+ch-'0';    return x*f;}inline void out(ll x){    int a[25],t=0;    if(x<0)putchar('-'),x=-x;    for(;x;x/=10)a[++t]=x%10;    for(int i=t;i;--i)putchar('0'+a[i]);    if(t==0)putchar('0');    putchar('\n');}struct re{int start,end,out;}st[1005];int n,m,r,f[1005],ans;inline bool cmp(re x,re y){return x.start==y.start?x.end<y.end:x.start<y.start;}int main(){    n=read();m=read();r=read();    for(int i=1;i<=m;++i)    st[i].start=read(),st[i].end=read(),st[i].out=read();    sort(st+1,st+1+m,cmp);    for(int i=1;i<=m;++i)f[i]=st[i].out;    for(int i=2;i<=m;++i)    for(int j=1;j<i;++j){        if(st[j].end+r<=st[i].start)f[i]=max(f[i],f[j]+st[i].out);    }    for(int i=1;i<=m;++i)ans=max(ans,f[i]);    out(ans);    return 0;}
0 0