• 任务安排(斜率优化模板题)



    任务安排##

      Time Limit: 1 Sec
      Memory Limit: 162 MB

    Description###

      N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务。从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时间是Ti。在每批任务开始前,机器需要启动时间S,而完成这批任务所需的时间是各个任务需要时间的总和(同一批任务将在同一时刻完成)。每个任务的费用是它的完成时刻乘以一个费用系数Ci。请确定一个分组方案,使得总费用最小。
      

    Input###

      第一行是N(1<=N<=5000)。
    第二行是S(0<=S<=50)。
    下面N行每行有一对数,分别为Ti和Ci,均为不大于100的正整数,表示第i个任务单独完成所需的时间是Ti及其费用系数Ci。
      

    Output###

      一个数,最小的总费用。
      

    Sample Input 1###

      5
      1
      1 3
      3 2
      4 3
      2 3
      1 4
      

    Sample Output 1###

      153
      

    HINT###

      1<N<=5000
      1<=S<=50
      1<=Ti Ci<=100
      
     

    题解:

         
      写出1D/1D动规方程:
      (f[i]=Min(f[j]+sumt[i]*(sumc[i]-sumc[j])+s*(sumc[n]-sumc[j])))
      移项得 $$f[j]=(s+sumt[i])sumc[j]-sumt[i]sumc[i]-s*sumc[n] $$
      把f[j]当作y,sumc[j]当作x (x单调递增)
       j1<j2<i。j2更优,当且仅当 f[j2]-f[j1]/(sumc[j2]-sumc[j1])<=s+sumt[i]
      g(a,b)(a<b) a,b两点间的斜率
       g(a,b)>g(b,c) (a<b<c),则讨论发现b不可能为最优解
      所以斜率必须单调递增且由于 s+sumt[i] 单调递增,被弹出元素不可能在为最优解
      单调队列维护即可
      
    www.cnblogs.com/AGFghy/


    AC代码

    #include<cstdio>
    typedef long long ll;
    const int N=3e5+5;
    int n,t,c,head,tail;
    int q[N];
    ll s,sumt[N],sumc[N],f[N];
    int main()
    {
        scanf("%d",&n);
        scanf("%lld",&s);
        for (int i=1; i<=n; i++)
        {
            scanf("%d%d",&t,&c);
            sumt[i]=sumt[i-1]+t;
            sumc[i]=sumc[i-1]+c;
        }
        f[0]=0;
        head=tail=1; q[1]=0;
        for (int i=1; i<=n; i++)
        {
            while (head<tail && f[q[head+1]]-f[q[head]]<=(s+sumt[i])*(sumc[q[head+1]]-sumc[q[head]])) head++;
            f[i]=f[q[head]]+s*(sumc[n]-sumc[q[head]])+sumt[i]*(sumc[i]-sumc[q[head]]);
            while (head<tail && (f[q[tail]]-f[q[tail-1]])*(sumc[i]-sumc[q[tail]])>=(f[i]-f[q[tail]])*(sumc[q[tail]]-sumc[q[tail-1]])) tail--;
            q[++tail]=i;
        }
        printf("%lld
    ",f[n]);
    }
    
  • 相关阅读:
    我的JAVA之旅(二)初识JAVA
    ORACLE并发处理
    我的JAVA之旅(一)安装配置
    我的JAVA之旅(三) 元素语法
    改变一生的五句话
    InstallShield集成安装MSDE2000最小版本(三) fishout特许授权发布
    IS2009修改XML File 奕婷特许授权发布
    SQL Server中多个表格求出相同列和不同列(答案来自CSDN上SQL专家的回答)
    InstallShield集成安装MSDE2000最小版本(二) fishout特许授权发布
    Installshield停止操作系统进程的代码 IS6及以上版本适用
  • 原文地址:https://www.cnblogs.com/AGFghy/p/9594547.html
Copyright © 2020-2023  润新知