zoukankan      html  css  js  c++  java
  • 任务安排

    这道题不太一样了。通过费用提前可以推倒递推式长这样:f[i]=min{f[j]+sumt[i]*(sumc[i]-sumc[j])+s*(sumc[n]-sumc[j])}

    写成一次函数形式长这样:f[j]=(s+sumt[i])*sumc[j]+f[i]-sumt[i]*sumc[i]-s*sumc[n]

    但是我们发现由于t不在保证是正数,sumt[i]也没有单调性,那么就只好二分求答案了。

    看代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    const int maxn=500000;
    int n,s,t[maxn],c[maxn],f[maxn];
    int st[maxn],sc[maxn],q[maxn];
    int yval(int a,int b){return f[b]-f[a];}
    int xval(int a,int b){return sc[b]-sc[a];}
    signed main(){
        cin>>n>>s;
        for(int i=1;i<=n;i++){
            scanf("%lld%lld",&t[i],&c[i]);
            st[i]=st[i-1]+t[i];
            sc[i]=sc[i-1]+c[i];
        }
        memset(f,0x3f,sizeof(f));
        int l=1,r=1;
        q[l]=0;f[0]=0;
        for(int i=1;i<=n;i++){
            int x=1,y=r;
            if(l!=r)
                while(x<y){
                    int mid=(x+y)>>1;
                    if(yval(q[mid],q[mid+1])<=(s+st[i])*xval(q[mid],q[mid+1]))x=mid+1;
                    else y=mid;
                }
            f[i]=f[q[x]]+st[i]*(sc[i]-sc[q[x]])+s*(sc[n]-sc[q[x]]);
            while(l<r&&yval(q[r-1],q[r])*xval(q[r],i)>=xval(q[r-1],q[r])*yval(q[r],i))r--;
            q[++r]=i;
        }
        printf("%lld
    ",f[n]);
        return 0;
    }
  • 相关阅读:
    JS数组及操作方法,堆和栈的概念
    JS变量作用域,浏览器预解析
    JS函数的基本概念
    JS循环语句
    JS程序三大结构及语法语句
    src与href
    JS概念及基本语法
    图片整合技术
    hdu6395 Sequence(分段矩阵快速幂)
    hdu6396 Swordsman(贪心)
  • 原文地址:https://www.cnblogs.com/syzf2222/p/12386838.html
Copyright © 2011-2022 走看看