ZR#998

ZR#998

解法:

先把所有物品按照拿走的时间从小到大排序,拿走的时间相同就按照放上去的时间从大到小。那么一件物品上方的物品就一定会在它的前面。
考虑 $ dp $ ,设 $ f[i][j] $ 表示 $ i $ 以及 $ i $ 上面物品在所有时刻中最大重量为 $ j $ 时的最大收益。
转移的时候,我们需要枚举所有 $ i $ 上面的物品,维护一个 $ g[i] $ 表示时刻 $ i $ 之前物品的最大收益是多少。然后直接转移就好了。

CODE:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>

using namespace std;

#define LL long long
#define N 100010

struct Node {
    int in,out;
    int w,s,v;
    inline bool operator < (const Node &x) const {
        if(in != x.in) return in < x.in;
        else return out > x.out;
    }
} a[N];

int f[1010][2010],n,ans,s;

int main() {
    scanf("%d%d",&n,&s);
    for(int i = 1 ; i <= n ; i++)
        scanf("%d%d%d%d%d",&a[i].in,&a[i].out,&a[i].w,&a[i].s,&a[i].v);
    sort(a + 1,a + n + 1);
    for(int i = 1 ; i <= n ; i++) {
        int u = min(s,a[i].s);
        for(int j = 0 ; j <= u ; j++) {
            f[i][j] = a[i].v;
            int sum = 0;
            for(int k = i - 1 ; k >= 1 ; k--) {
                if(a[k].out >= a[i].out) f[i][j] = max(f[i][j],f[k][j + a[i].w] + a[i].v + sum);
                if(a[k].out <= a[i].in && a[k].s <= j + a[i].w) sum += a[k].v;
            }
            ans = max(ans,f[i][j]);
        }
    }
    printf("%d \n",ans);
    //system("pause");
    return 0;
}
补充,因为写完题解就被叉了,所以补一发改过后的。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>

using namespace std; 

#define LL long long
#define N 1010

struct bag {
    int in, out;
    int w, s, v; 
} d[N];
int n,S,f[N][N],g[N][N]; 

inline bool cmp(bag a, bag b) {
    if (a.out == b.out)return a.in > b.in; 
    else return a.out < b.out; 
}

int main() {
    scanf("%d%d",&n,&S); 
    for(int i = 1 ; i <= n ; i++)
        scanf("%d%d%d%d%d",&d[i].in,&d[i].out,&d[i].w,&d[i].s,&d[i].v); 
    d[0].out = 2 * n + 1,d[0].s = S; 
    sort(d,d + n + 1,cmp); 
    for(int i = 0 ; i <= n ; i++) {
        int j = 0, t = min(d[i].s, S - d[i].w); 
        memset(g,0,sizeof(g)); 
        while(d[j].out <= d[i].in) j++; 
        for(int k = d[i].in + 1 ; k <= d[i].out ; k++) {
            memcpy(g[k],g[k-1],sizeof(g[k])); 
            while(j < i && d[j].out == k) {
                if(d[j].in < d[i].in) {
                    j++; 
                    continue; 
                }
                for(int l = 0 ; l <= t ; l++)
                    g[k][l] = max(g[k][l], g[d[j].in][l] + f[j][l]); 
                j++; 
            }
        }
        for(int k = 0 ; k <= t ; k++)
            f[i][k + d[i].w] = g[d[i].out][k] + d[i].v; 
        for(int k = 1 ; k <= S ; k++)
            f[i][k] = max(f[i][k], f[i][k - 1]); 
    }
    printf("%d\n", f[n][S]); 
    //system("pause");
    return 0; 
}

转载于:https://www.cnblogs.com/Repulser/p/11488171.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 智慧社区背景与挑战 随着城市化的快速发展,社区面临健康、安全、邻里关系和服务质量等多方面的挑战。华为技术有限公司提出智慧社区解决方案,旨在通过先进的数字化技术应对这些问题,提升城市社区的生活质量。 2. 技术推动智慧社区发展 技术进步,特别是数字化、无线化、移动化和物联化,为城市社区的智慧化提供了可能。这些技术的应用不仅提高了社区的运行效率,也增强了居民的便利性和安全性。 3. 智慧社区的核心价值 智慧社区承载了智慧城市的核心价值,通过全面信息化处理,实现对城市各个方面的数字网络化管理、服务与决策功能,从而提升社会服务效率,整合社会服务资源。 4. 多层次、全方位的智慧社区服务 智慧社区通过构建和谐、温情、平安和健康四大社区模块,满足社区居民的多层次需求。这些服务模块包括社区医疗、安全监控、情感沟通和健康监测等。 5. 智慧社区技术框架 智慧社区技术框架强调统一平台的建设,设立数据中心,构建基础网络,并通过分层建设,实现平台能力及应用的可持续成长和扩展。 6. 感知统一平台与服务方案 感知统一平台是智慧社区的关键组成部分,通过统一的RFID身份识别和信息管理,实现社区服务的智能化和便捷化。同时,提供社区内外监控、紧急救助服务和便民服务等。 7. 健康社区的构建 健康社区模块专注于为居民提供健康管理服务,通过整合医疗资源和居民接入,实现远程医疗、慢性病管理和紧急救助等功能,推动医疗模式从治疗向预防转变。 8. 平安社区的安全保障 平安社区通过闭路电视监控、防盗报警和紧急求助等技术,保障社区居民的人身和财产安全,实现社区环境的实时监控和智能分析。 9. 温情社区的情感沟通 温情社区着重于建立社区居民间的情感联系,通过组织社区活动、一键呼叫服务和互帮互助平台,增强邻里间的交流和互助。 10. 和谐社区的资源整合 和谐社区作为社会资源的整合协调者,通过统一接入和身份识别,实现社区信息和服务的便捷获取,提升居民生活质量,促进社区和谐。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值