CF724E Goods transportation

Goods transportation

有 𝑛 座城市,第 𝑖 座城市会生产 𝑝𝑖 商品,可以卖出 𝑠𝑖 商品。

对于一对城市 𝑖,𝑗(𝑖 < 𝑗),𝑖 可以向 𝑗 运输不超过 𝑐(对于所有 𝑖,𝑗 均相同)的商品。

求最多能卖出多少商品。

𝑛 ≤ 10000。

题解

显然有一个网络流模型,源点向第 𝑖 个点连容量为 𝑝𝑖 的边,第 𝑖 个点向汇点连容量为 𝑠𝑖 的边,第 𝑖 个点向第 𝑗 (𝑖 < 𝑗) 个点连容量为 𝑐 的边,求个最大流。

但是跑得很慢。

考虑最大流等于最小割。

𝑓[𝑖][𝑗] 表示前 𝑖 个点,有 𝑗 个点属于 𝑆 集合的最小割为多少。

枚举第 𝑖 个点属于 𝑆 集还是 𝑇 集转移。属于\(S\)集合只需要断它连向\(T\)的边,属于\(T\)集合不仅要断\(S\)连向它的边,还要断前面属于\(S\)集合的点连向它的边。

复杂度 𝑂(𝑛2)。

CO int N=1e4+10;
CO int64 inf=1e18;
int64 c,s[N],t[N];
int64 dp[2][N];

int main(){
	int n=read<int>();
	read(c);
	for(int i=1;i<=n;++i) read(s[i]);
	for(int i=1;i<=n;++i) read(t[i]);
	for(int i=1;i<=n;++i){
		dp[i&1][0]=dp[(i-1)&1][0]+s[i],dp[i&1][i+1]=inf;
		for(int j=1;j<=i;++j)
			dp[i&1][j]=min(dp[(i-1)&1][j]+c*j+s[i],dp[(i-1)&1][j-1]+t[i]);
	}
	int64 ans=inf;
	for(int i=0;i<=n;++i) ans=min(ans,dp[n&1][i]);
	printf("%lld\n",ans);
	return 0;
}

posted on 2020-04-22 11:36  autoint  阅读(178)  评论(0编辑  收藏  举报

导航