zoukankan      html  css  js  c++  java
  • 洛谷 P1156 垃圾陷阱

    题意简述

    一头牛被困在垃圾井中,要通过垃圾来维持生命,或堆高来逃出垃圾井
    有n个垃圾,知道扔下的时间,堆放的高度,维持生命的时间,求逃出井的时间或最长存活时间

    题解思路

    背包。
    把垃圾的高度看成物重,维持生命的时间看成价值,把井的高度看成包的大小。

    代码

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    int d, g, ans = -1;
    int dp[2][110];
    struct Rub { int t, h, f; } r[110];
    inline bool cmp(const Rub& x, const Rub& y) { return x.t < y.t; }
    inline void mmax(int& x, const int& y) { if (y > x) x = y; }
    int main()
    {
    	scanf("%d%d", &d, &g);
    	for (int i = 1; i <= g; ++i) scanf("%d%d%d", &r[i].t, &r[i].f, &r[i].h);
    	std::sort(r + 1, r + g + 1, cmp);
        memset(dp, ~0x3f, sizeof(dp));
    	dp[0][0] = 10;
    	for (register int i = 1; i <= g; ++i)
    	{
    		int t1 = i & 1, t2 = t1 ^ 1;
    		memset(dp[t1], ~0x3f, sizeof(dp[t1]));
    		for (register int j = d; j >= 0; --j)
    			if (dp[t2][j] >= (r[i].t - r[i - 1].t))
    			{
    				if ((j + r[i].h) >= d)
    				{
    					printf("%d
    ", r[i].t);
    					return 0;
    				}
    				mmax(dp[t1][j + r[i].h], dp[t2][j] - r[i].t + r[i - 1].t);
    				mmax(dp[t1][j], dp[t2][j] + r[i].f - r[i].t + r[i - 1].t);
    			}
    		mmax(ans, dp[t1][0] + r[i].t);
    	}
    	printf("%d
    ", ans);
    }
    
  • 相关阅读:
    5个排序算法
    原生侧边栏sidebar
    静态方法、实例方法、继承
    函数作用域之闭包与this!
    OOP面向对象编程(下)
    数组方法篇二
    对象
    nginx windows负载均衡入门
    NVelocity
    python3简单爬虫
  • 原文地址:https://www.cnblogs.com/xuyixuan/p/11191067.html
Copyright © 2011-2022 走看看