NC51204. 任务安排2
描述
输入描述
Your program reads from standard input. The first line contains the number of jobs N,. The second line contains the batch setup time S which is an integer, . The following N lines contain information about the jobs 1, 2,..., N in that order as follows. First on each of these lines is an integer, the processing time of the job. Following that, there is an integer , the cost factor of the job.
输出描述
Your program writes to standard output. The output contains one line, which contains one integer: the minimum possible total cost.
示例1
输入:
5 1 1 3 3 2 4 3 2 3 1 4
输出:
153
C++14(g++5.4) 解法, 执行用时: 7ms, 内存消耗: 3048K, 提交时间: 2020-04-13 18:12:24
#include<bits/stdc++.h> using namespace std; const int N=300010; long long dp[N],sumt[N],sumc[N],q[N]; int main() { int n,s; cin>>n>>s; for(int i=1;i<=n;i++) { int t,c; scanf("%d%d",&t,&c); sumt[i]=sumt[i-1]+t; sumc[i]=sumc[i-1]+c; } memset(dp,0x3f3f3f3f,sizeof(dp)); dp[0]=0; int head=1,tail=1; q[1]=0; for(int i=1;i<=n;i++) { while(head<tail&&(dp[q[head+1]]-dp[q[head]])<=(s+sumt[i])*(sumc[q[head+1]]-sumc[q[head]])) head++; dp[i]=dp[q[head]]-(s+sumt[i])*sumc[q[head]]+sumt[i]*sumc[i]+s*sumc[n]; while(head<tail&&(dp[q[tail]]-dp[q[tail-1]])*(sumc[i]-sumc[q[tail]])>=(dp[i]-dp[q[tail]])*(sumc[q[tail]]-sumc[q[tail-1]])) tail--; q[++tail]=i; } cout<<dp[n]<<endl; return 0; }
C++(g++ 7.5.0) 解法, 执行用时: 8ms, 内存消耗: 2900K, 提交时间: 2022-08-12 10:23:44
#include<bits/stdc++.h> using namespace std; typedef long long ll; long long f[300010],sumt[300010],sumc[300010]; int q[300010],n,s; int main(){ cin>>n>>s; for(int i=1; i<=n; i++) { int t,c; cin>>t>>c; sumt[i]=sumt[i-1]+t; sumc[i]=sumc[i-1]+c; } memset(f,0x3f,sizeof(f)); f[0]=0; int l=1,r=1; q[1]=0; for(int i=1; i<=n; i++) { while(l<r&&(f[q[l+1]]-f[q[l]])<=(s+sumt[i])*(sumc[q[l+1]]-sumc[q[l]]))l++; f[i]=f[q[l]]-(s+sumt[i])*sumc[q[l]]+sumt[i]*sumc[i]+s*sumc[n]; while(l<r&&(f[q[r]]-f[q[r-1]])*(sumc[i]-sumc[q[r]])>=(f[i]-f[q[r]])*(sumc[q[r]]-sumc[q[r-1]]))r--; q[++r]=i; } cout<<f[n]<<endl; }
C++(clang++11) 解法, 执行用时: 93ms, 内存消耗: 1016K, 提交时间: 2021-04-10 14:38:19
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=5e4+7; ll f[N],st[N],sc[N]; int n,s; int main(){ cin>>n>>s; for(int i=1;i<=n;i++){ int t,c;cin>>t>>c; st[i]=st[i-1]+t; sc[i]=sc[i-1]+c; } memset(f, 0x3f, sizeof(f)); f[0]=0; for(int i=1;i<=n;i++) for(int j=0;j<i;j++) f[i]=min(f[i],f[j]+st[i]*(sc[i]-sc[j])+s*(sc[n]-sc[j])); cout<<f[n]<<endl; }