AcWing 300 任务安排1 解题思路:这题还没上难度,还没有用到斜率优化,将每个任务的时间和花费用前缀和的形式储存,每个任务节点的s都会影响后面的所有节点,所以将这个任务的s的所有影响都算在这一次任务里,用f[i]表示这一批任务结束的任务编号为i,j表示上一批任务的最后一个任务的编号,用前缀和计算公式,求解: 公式:f[i] = min(f[i], f[j] + s * (sumc[n] - sumc[j]) + (sumc[i] - sumc[j]) * sumt[i])
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 5010;
int n, s;
int sumc[N], sumt[N];
int f[N];
signed main()
{
cin>>n>>s;
for(int i = 1; i <= n; i ++ ){
int t, c;
cin>>t>>c;
sumc[i] = sumc[i - 1] + c;
sumt[i] = sumt[i - 1] + t;
}
memset(f, 0x3f3f3f3f, 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] + s * (sumc[n] - sumc[j]) + (sumc[i] - sumc[j]) * sumt[i]);
}
}
cout<<f[n]<<endl;
return 0;
}
|