任务安排

Posted syzf2222

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了任务安排相关的知识,希望对你有一定的参考价值。

这道题不太一样了。通过费用提前可以推倒递推式长这样: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;
}

以上是关于任务安排的主要内容,如果未能解决你的问题,请参考以下文章

贪心算法----区间覆盖问题(POJ2376)

如何在 Windows 服务中使用 Quartz.Net 安排任务?

使用 Laravel 每天安排两次任务

译文:18个实用的JavaScript代码片段,助你快速处理日常编程任务

任务安排

如何安排 C# Windows 服务每天执行任务?