C

来源:互联网 发布:mina发送广播数据 编辑:程序博客网 时间:2024/06/15 11:26

C - Functions again

题意:

​ 给出一个序列,定义一个区间函数为:img

求出最大的值。

思路:

​ 直接求没有办法求出,思考其公式,假如最终答案是区间l,r,其和最大,那么必然是正负正负正的形式,所以只需求出所有的正负情况,然后求出区间的最大子序列和即可。

#include <iostream>#include <cstdio>#include <cstring>#include <math.h>#include <cstdlib>using namespace std;const int maxn = 1e5+10;typedef long long LL;int n;LL a[maxn],b[maxn],c[maxn];int main(){    //freopen("in.txt","r",stdin);    scanf("%d",&n);    for(int i = 1;i <= n; i++) {        scanf("%I64d",&c[i]);    }    for(int i = 1;i < n; i++) {        if(i%2) {            a[i] = abs(c[i]-c[i+1]);            b[i] = -abs(c[i]-c[i+1]);        }        else {            a[i] = -abs(c[i]-c[i+1]);            b[i] = abs(c[i]-c[i+1]);        }    }    LL ans = 0,sum = 0;    for(int i = 1;i < n; i++) {        sum += a[i];        if(sum > ans) ans = sum;        if(sum < 0) sum = 0;    }    sum = 0;    for(int i = 1;i < n; i++) {        sum += b[i];        if(sum > ans) ans = sum;        if(sum < 0) sum = 0;    }    printf("%I64d\n",ans);    return 0;}