其他分享
首页 > 其他分享> > CF1400E Clear the Multiset 题解

CF1400E Clear the Multiset 题解

作者:互联网

考虑一个分治:每次如果要用第一种,一定是给整个区间用,直到没有办法覆盖整个区间,用的次数是 \(\min_{i=L}^R a_i\) 次,减去它之后分别递归最小值的两边。注意到如果某一次不使用第一个操作,那么以后也都不会用了,此时操作总数就是不为 \(0\) 的位置个数。复杂度最慢也是 \(O(n^2)\) 的。

点击查看代码
const int N=5000+13;
int a[N],n;
int solve(int l,int r){
	if(l>r) return 0;
	if(l==r) return a[l]>0;
	int cnt=0;
	for(int i=l;i<=r;++i) cnt+=(a[i]>0);
	int p=l;
	for(int i=l+1;i<=r;++i)
		if(a[i]<a[p]) p=i;
	int tmp=a[p];
	for(int i=l;i<=r;++i) a[i]-=tmp;
	std::vector<int> b;
	for(int i=l;i<=r;++i) b.pb(a[i]);
	int res1=solve(l,p-1);
	for(int i=l;i<=r;++i) a[i]=b[i-l];
	int res=min(cnt,res1+solve(p+1,r)+tmp);
	return res;
}
int main(){
	read(n);
	for(int i=1;i<=n;++i) read(a[i]);
	print(solve(1,n));
	return 0;
}

标签:CF1400E,return,int,题解,复杂度,solve,区间,Multiset
来源: https://www.cnblogs.com/winterfrost/p/cf1400e-solution.html