标签:CF1400E return int 题解 复杂度 solve 区间 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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。