zoukankan      html  css  js  c++  java
  • CH300 任务安排1 题解报告

    题目传送门

    【题目大意】

    有$n$个任务要按照一定的顺序加工,第$i$个任务要花费$T_i$的时间完成。可以分成若干批进行加工,每一批任务开始加工之前要花费$S$的时间启动机器。从时刻$0$开始,完成第$i$个任务的费用是$C_i$乘它的完成时刻$($每个任务的完成时刻为其所在的那一批任务的最后一个任务的完成时刻$)$,求最小总费用。

    【思路分析】

    首先很简单可以想到设$f[i][j]$为前$i$个任务分成$j$批完成的最小总费用,转移方程为$f[i][j]=min{f[k][j-1]+(S*j+sum_{x=1}^{i}T_x)*sum_{x=k+1}^{i}C_x}(0le k<i)$

    显然时间复杂度为$O(n^3)$,这样肯定过不了,我们考虑如何优化。

    实际上我们每次重新启动机器,相当于让后面所有任务的完成时刻同时加上$S$,也就是说我们并不需要知道前面的任务已经分成了几批。

    设$f[i]$表示完成前$i$个任务的最小总费用$($包括后面的任务多出的$S$时间所花费的费用$)$,则转移方程为$f[i]=min{f[j]+sum_{x=1}^{i}T_x*sum_{x=j+1}^{i}C_x+S*sum_{x=j+1}^{n}C_x}(0le j<i)$

    【代码实现】

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 #include<queue>
     7 #define g() getchar()
     8 #define rg register
     9 #define go(i,a,b) for(rg int i=a;i<=b;i++)
    10 #define back(i,a,b) for(rg int i=a;i>=b;i--)
    11 #define db double
    12 #define ll long long
    13 #define il inline
    14 #define pf printf
    15 #define mem(a,b) memset(a,b,sizeof(a))
    16 using namespace std;
    17 ll fr(){
    18     ll w=0,q=1;
    19     char ch=g();
    20     while(ch<'0'||ch>'9'){
    21         if(ch=='-') q=-1;
    22         ch=g();
    23     }
    24     while(ch>='0'&&ch<='9') w=(w<<1)+(w<<3)+ch-'0',ch=g();
    25     return w*q;
    26 }
    27 const int N=5002;
    28 int n,s;
    29 ll f[N],st[N],sc[N];
    30 int main(){
    31     //freopen("","r",stdin);
    32     //freopen("","w",stdout);
    33     n=fr();s=fr();
    34     go(i,1,n)st[i]=st[i-1]+fr(),sc[i]=sc[i-1]+fr();
    35     mem(f,0x3f);f[0]=0;
    36     go(i,1,n)go(j,0,i-1)
    37         f[i]=min(f[i],f[j]+st[i]*(sc[i]-sc[j])+s*(sc[n]-sc[j]));
    38     pf("%lld
    ",f[n]);
    39     return 0;
    40 }
    代码戳这里
  • 相关阅读:
    Java IO流 简介
    Centos8安装java部署环境
    RedisTemplate
    手把手教windows上安装linux虚拟机及环境配置
    使用Swagger2构建 RESTful API文档
    VMware 安装 Centos 7 虚拟机配置网络
    别再写满屏的 try catch 了
    isEmpty 和 isBlank 的用法区别
    SpringBoot 中必须掌握的45个注解
    数组的栈方法
  • 原文地址:https://www.cnblogs.com/THWZF/p/11716518.html
Copyright © 2011-2022 走看看