• 【BZOJ】1642: [Usaco2007 Nov]Milking Time 挤奶时间(dp)


    http://www.lydsy.com/JudgeOnline/problem.php?id=1642

    果然没能仔细思考是不行的。。

    以后要静下心来好好想,不要认为不可做。。。。。

    看了题解。。。

    首先按开始时间排序,然后

    f[i]表示前i个最多能够挤得的奶,那么有

    f[i]=w[i],初始化

    f[i]=max(f[i], f[j]+w[i]) 当j的结束时间+R不超过i的开始时间

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <string>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    using namespace std;
    #define rep(i, n) for(int i=0; i<(n); ++i)
    #define for1(i,a,n) for(int i=(a);i<=(n);++i)
    #define for2(i,a,n) for(int i=(a);i<(n);++i)
    #define for3(i,a,n) for(int i=(a);i>=(n);--i)
    #define for4(i,a,n) for(int i=(a);i>(n);--i)
    #define CC(i,a) memset(i,a,sizeof(i))
    #define read(a) a=getint()
    #define print(a) printf("%d", a)
    #define dbg(x) cout << #x << " = " << x << endl
    #define printarr(a, n, m) rep(aaa, n) { rep(bbb, m) cout << a[aaa][bbb]; cout << endl; }
    inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
    inline const int max(const int &a, const int &b) { return a>b?a:b; }
    inline const int min(const int &a, const int &b) { return a<b?a:b; }
    
    const int N=1005;
    struct nod { int s, e, w; }a[N];
    int n, r, m, f[N];
    bool cmp(const nod &a, const nod &b) { return a.s<b.s; }
    
    int main() {
    	read(n); read(m); read(r);
    	for1(i, 1, m) read(a[i].s), read(a[i].e), read(a[i].w);
    	sort(a+1, a+1+m, cmp);
    	int ans=0;
    	for1(i, 1, m) {
    		f[i]=a[i].w;
    		for1(j, 1, i-1) if(a[i].s>=a[j].e+r && f[i]<f[j]+a[i].w) f[i]=f[j]+a[i].w;
    		ans=max(ans, f[i]);
    	}
    	print(ans);
    	return 0;
    }
    

    Description

    贝 茜是一只非常努力工作的奶牛,她总是专注于提高自己的产量。为了产更多的奶,她预计好了接下来的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 个小时内,最大的挤奶的量。

    Input

    第1行三个整数N,M,R.接下来M行,每行三个整数Si,Ei,Pi.

    Output

     最大产奶量.

    Sample Input

    12 4 2
    1 2 8
    10 12 19
    3 6 24
    7 10 31

    Sample Output

    43

    HINT

    注意:结束时间不挤奶

    Source

  • 相关阅读:
    Oracle-通过创建索引加快SQL执行效率
    Oracle-DG,MRP进程无法正常应用问题处理,重启大法好
    Oracle-DG,12c pdb创建测试
    Oracle-DG,疑问主库添加日志后,备库未操作主库日志比备库日志数量多,有什么影响?
    Oracle-DG疑问,什么情况下主库会发出一个会话连接备库
    Oracle-DG 主库将log_archive_dest_state_2远程归档线程参数设置为defer,为什么dg还是处于实时同步状态?
    Oracle-rm误删除数据文件,如何强制删除文件启动db
    Oracle-buffer cache过小导致SQL执行时间长
    win10下完全卸载-重装MySQL
    VSCode配置详细教程
  • 原文地址:https://www.cnblogs.com/iwtwiioi/p/3954238.html
Copyright © 2020-2023  润新知