P2365 任务安排

费用提前计算。

我们可以不记录当前是第多少段,而是转化为每分一段就会给后面的所有工作增加一个常数的时间,提前计算这一部分代价即可。

#include<bits/stdc++.h>
#define int long long
using namespace std;
#define orz cout<<"lytcltcltcltcltcltcl"<<endl
inline int r(){int s=0,k=1;char c=getchar();while(!isdigit(c)){if(c=='-')k=-1;c=getchar();}while(isdigit(c)){s=s*10+c-'0';c=getchar();}return s*k;}
int n,s,t[1000001],d[1000001],st[1000001],sd[1000001],f[1000001];
signed main()
{
	n=r();s=r();
	for(int i=1;i<=n;i++)
	{
		t[i]=r();d[i]=r();
		st[i]=st[i-1]+t[i];
		sd[i]=sd[i-1]+d[i];
	}
	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]*(sd[i]-sd[j])+s*(sd[n]-sd[j]));
		}
	}
	cout<<f[n];
}
posted @ 2021-10-19 19:38  lei_yu  阅读(38)  评论(0编辑  收藏  举报