C
来源:互联网 发布:mina发送广播数据 编辑:程序博客网 时间:2024/06/15 11:26
C - Functions again
题意:
给出一个序列,定义一个区间函数为:
求出最大的值。
思路:
直接求没有办法求出,思考其公式,假如最终答案是区间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;}
阅读全文
0 0