E. Clear the Multiset 题解(分治+贪心)

题目链接

题目思路

就是利用分治的思想

对于区间\([l,r]\)如果要使用操作\(1\)

那么根据贪心的思想一定是使得\(a[l],a[l+1]...a[r]\)全部减去这个区间的最小值

代码

#include<bits/stdc++.h>
#define fi first
#define se second
#define debug cout<<"I AM HERE"<<endl;
using namespace std;
typedef long long ll;
const int maxn=2e5+5,inf=0x3f3f3f3f,mod=1e9+7;
const double eps=1e-6;
int n;
int a[maxn];
int solve(int l,int r){
    if(l>r) return 0;
    if(l==r){
        if(a[l]>0){
            return 1;
        }else{
            return 0;
        }
    }
    int mi=inf,id=-1;
    for(int i=l;i<=r;i++){
        if(a[i]<mi){
            mi=a[i];
            id=i;
        }
    }
    for(int i=l;i<=r;i++){
        a[i]-=mi;
    }
    return min(r-l+1,solve(l,id-1)+solve(id+1,r)+mi);
}
signed main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    int ans=solve(1,n);
    printf("%d\n",ans);
    return 0;
}
 
posted @ 2021-09-14 10:19  hunxuewangzi  阅读(64)  评论(0编辑  收藏  举报