P1969 积木大赛(思维 差分)

题目链接
最近在补前缀和以及差分的题目.大部分题目都是前缀和,这题是差分,记录一下.
题意很简单,就是给一段序列,一开始序列都是0,每次可以操作连续的区间+1,要求到达目标的最少操作数
分析一下样例 2 3 4 1 2. 这种区间问题应该很好想到差分,前缀和什么的.对区间进行加减操作,很符合差分的特点,我们求一下这个数组的差分数组: 2 1 1 -3 1 出现正数很简单,就说明要对这之后一段区间进行+x操作,那么出现负数呢?说明如果它需要操作的话在前面操作更大的值得时候顺便操作了,但超过这个值得时候就不能连续操作了,要分开来操作.所以出现负数是不需要考虑这次操作的.只要考虑之后的操作就可以了.说的可能有点混乱.推荐一篇说差分的博客.
附上代码

#define LL long long
#include <iostream>
using namespace std;
const int N = 1e5+10;
int a[N];
int main(){
    int n;
    LL ans = 0;
    cin >> n;
    for(int i=1;i<=n;++i) cin >> a[i];
    for(int i=n;i>=1;--i) a[i] -= a[i-1];
    for(int i=1;i<=n;++i) if(a[i] > 0) ans += a[i];
    cout << ans;
    
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45590210/article/details/104750196