插分 贪心
查看原帖
插分 贪心
451195
zf1029752314楼主2021/5/5 20:41

插分 贪心

这道题主要是在一段数组,问我们最小操作数,我们只有一种操作,就是从l-r使我们数组(数组名是s)s[l]-s[r]全部-1,所以我想到了能O(1)修改区间的插分

样例 4 3 2 5 3 5

差分 0 4 -1 -1 3 -2 2

插分修改区间l到r - 1是

s[l]-1

s[r+1]-1

我们最终是把数组操作成全0

0 0 0 0 0 0 0

因为我们前i个数前缀和是道路深度,一定大于等于0,所以插分数组一个负数左边一定有正数,让我们进行刚才的插分操作,我们整个前缀和大于等于0,所以最后会只剩下正数或0,如果只剩下正数那么操作时,r=n,也就是s[n+1]-1;不过可以不管,超出插分数组了,所以我们算左端操作比较简单

问题就转化成插分数组正数的和

插分不多赘述

    for(int i=n;i>=1;i--) s[i]=s[i]-s[i-1];

ac程序 时间复杂度O(N) 空间复杂度O(N)

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 100010;

int n;
int s[N];
int ans;

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>s[i];
    }
    for(int i=n;i>=1;i--) s[i]=s[i]-s[i-1];
    for(int i=1;i<=n;i++){
        if(s[i]>0) ans+=s[i];
    }
    cout<<ans;
    return 0;
}

2021/5/5 20:41
加载中...