题解 P2517 【[HAOI2010]订货】

DP做法

这道题的做法很多,但是我认为~其他题解讲的不很具体~

我就来讲一下我思考的过程吧qwq

方程还是比较好列的:设\(F[i,j]\)表示前i个月的任务完成后仓库里剩余的货物量为\(j\)时的最小花费
则有方程:

\[F[i,j]=min\{F[i-1,k]+m*k+d[i]*(j+u[i]-k)\},k\leqslant j+u[i]\]

其中\(m*k\)为囤积货物的费用,\(j+u[i]-k\)为这个月新买的货物
但是这样是\(O(n*S^2)\)的,需要优化:
把与k有关的项提出来,方程化为:

\[F[i,j]=min\{F[i-1,k]+(m-d[i])*k\}+d[i]*(j+u[i]),k\leqslant min(j+u[i],s)\]

我们可以先不管与k无关的项,最后再加上即可,先记为:

\[F[i,j]=min\{F[i-1,k]+(m-d[i])*k\},k\leqslant min(j+u[i],s)\]

再写出\(F[i,j-1]\)的表达式:

\[F[i,j-1]=min\{F[i-1,k]+(m-d[i])*k\},k\leqslant min(j+u[i]-1,s)\]

便可以发现,\(j\)每增大\(1\)\(F[i,j]\)的取值范围只比\(F[i,j-1]\)的取值范围大了\(1\),那么我们可以将方程化简为:

\[F[i,j]=min(F[i,j-1],F[i,j+u[i]]+(j+u[i])*m-d[i]*(u[i]+j))\]

显然 \(j=0\)的时候需要枚举\(k\)算一下
\(PS:\)注意判断一下\(j+u[i]\)有没有超出边界
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <cctype>
#include <queue>
#include <stack>
#include <map>
#include <set>
using namespace std;

#define inf 0x3f3f3f3f
typedef long long LL;
#define il inline

il int read(int x=0,int f=1,char ch='0')
{
    while(!isdigit(ch=getchar())) if(ch=='-') f=-1;
    while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
    return f*x;
}

//f[i][j] :前i个月剩余的货物量为j时的最小花费
//f[i][j]=min{f[i-1][k]+m*k+d[i]*(j+u[i]-k)},k<=j+u[i]

//f[i][j]=min{f[i-1][k]+(m-d[i])*k},k<=min(j+u[i],s)
//f[i][j-1]=min{f[i-1][k]+(m-d[i])*k},k<=min(j+u[i]-1,s)

//f[i][j]=min(f[i][j-1],f[i-1][j+u[i]]+(j+u[i])*m-d[i]*(u[i]+j))

//f[i][j]+=+d[i]*(u[i]+j)

const int N=50+5,S=1e4+5;
int f[N][S];
int n,m,s;
int u[N],d[N];

il void work()
{
    memset(f,0x3f,sizeof(f));
    f[0][0]=0;
    for(int i=1;i<=n;++i)
    {
        for(int k=0;k<=0+u[i]&&k<=s;++k) f[i][0]=min(f[i][0],f[i-1][k]+(m-d[i])*k);
        for(int j=1;j<=s;++j)
        {
            if(j+u[i]<=s) f[i][j]=min(f[i][j-1],f[i-1][j+u[i]]+(j+u[i])*m-d[i]*(u[i]+j));
            else f[i][j]=f[i][j-1];
        }
        for(int j=0;j<=s;++j) f[i][j]+=d[i]*(u[i]+j);
    }
    int ans=f[n][0];

    printf("%d\n",ans);
}

int main()
{
    scanf("%d%d%d",&n,&m,&s);
    for(int i=1;i<=n;++i) scanf("%d",&u[i]);
    for(int i=1;i<=n;++i) scanf("%d",&d[i]);
    work();    
    return 0;
}

转载于:https://www.cnblogs.com/wmq12138/p/11210138.html

在当今化工行业转型升级的大潮中,智慧化工园区作为推动绿色、创新、高质量发展的关键力量,正逐步成为行业发展的新趋势。随着国家政策的不断引导和推动,智慧化工园区的建设已不仅仅是提升管理服务水平的手段,更是实现安全生产、环境保护和应急响应能力全面提升的重要途径。从提升重大危险源监测、隐患排查到完善风险分级管控机制,智慧化工园区利用信息化、智能化技术,构建了一个全方位、多层次的安全、环保、应急救援一体化管理平台。 智慧化工园区以安全、便捷、高效、节能、物联为核心理念,通过深度融合云计算、物联网、人脸识别、大数据分析、人工智能等先进技术,实现了园区生产、车辆、人员、环境、能源等关键环节的智能化管理。在基础网络方面,园区不仅实现了全千兆光纤接入,还覆盖了5G信号、NB-IoT信号和WiFi网络,为万物互联提供了坚实的基础。智慧安监作为园区的核心板块,通过企业安全云服务、安全文化宣传教育、舆情信息监管、风险分级管控、隐患排查治理以及重大危险源管理等功能,构建了从源头到末端的全过程安全监管体系。特别是企业一张表功能,实现了企业档案的数字化管理,为精准施策提供了有力支持。此外,智慧园区还通过物联网监测预警系统,利用智能终端设备对园区内的各类风险进行实时监测和预警,确保园区安全无虞。 在智慧节能与环保方面,园区通过智能仪表监测电、水、冷、气等能耗数据,实现能源管理的精细化和节能减排。智慧应急系统则融合了指挥调度、辅助决策等功能,能够在突发情况下迅速响应,有效处置。智慧环保系统则利用物联网技术和大数据分析,实现了环境质量的自动监测和预警,为环保部门提供了精准的执法依据。同时,智慧物流、智慧安防、智慧楼宇等系统的引入,进一步提升了园区的智能化水平和运行效率。这些系统的集成应用,不仅让园区的管理更加便捷高效,还极大地提升了园区的整体竞争力和可持续发展能力。对于正在筹备或优化智慧化工园区建设方案的读者来说,这份解决方案无疑提供了宝贵的参考和灵感,让智慧化工园区的建设之路变得更加清晰和有趣。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值