NC50539. 任务安排 3
描述
输入描述
第一行两个整数,分别为N,S;
接下来N行每行两个整数。
输出描述
一个数,最小的总费用。
示例1
输入:
5 1 1 3 3 2 4 3 2 3 1 4
输出:
153
C++11(clang++ 3.9) 解法, 执行用时: 80ms, 内存消耗: 5368K, 提交时间: 2020-10-20 08:23:16
#include<bits/stdc++.h> using namespace std; const int nn=301019; int n,s,tot,q[nn]; double k[nn]; struct point{int c,t;long long f;}p[nn]; double slope(int i,int j){return 1.0*(p[j].f-p[i].f)/(p[j].c-p[i].c);} signed main(){ k[0]=-76801020,scanf("%d%d",&n,&s); for(int i=1;i<=n;i++) scanf("%d%d",&p[i].t,&p[i].c), p[i].t+=p[i-1].t,p[i].c+=p[i-1].c; for(int i=1,j;i<=n;i++) if(p[i].c!=p[i-1].c){ j=q[upper_bound(k,k+tot+1,s+p[i].t)-k-1]; p[i].f=p[j].f+1ll*p[i].t*(p[i].c-p[j].c)+1ll*s*(p[n].c-p[j].c); while(tot&&k[tot]>slope(q[tot-1],i))tot--; q[++tot]=i,k[tot]=slope(q[tot-1],i); }return printf("%lld\n",p[n].f),0; }