HAUTOJ奇数最大子段和

来源:互联网 发布:莎莎官网app网络慢 编辑:程序博客网 时间:2024/06/05 10:18

题目描述

一个大小为n的数组a1到an(−10^4≤ai≤10^4)。请你找出一个连续子段,使子段长度为奇数,且子段和最大。

输入

第一行为T(1≤T≤5),代表数据组数。
之后每组数据,第一行为n(1≤n≤10^5),代表数组长度。
之后一行n个数,代表a1到an

输出

每组数据输出一行,表示满足要求的子段和最大值

样例输入

141 2 3 4

样例输出

9


蛮有意思的一道题,和最大子段和极其相似。

思路:

先从奇数扫一遍最大,再从偶数扫一遍,最后比较输出。

方法比较奇妙。

代码:

#include<cstdio>#include<iostream>#include<cmath>using namespace std;int ax[100005];int main(){    int t;    scanf("%d",&t);    while (t--)    {        int n;        scanf("%d",&n);        for (int i=0; i<n; ++i)        {            scanf("%d",&ax[i]);        }        int ans,sum;        ans=ax[0];        sum=ax[0];                //首先扫一边奇数        for (int i=1; i<n-1; i+=2)        {            sum=sum+ax[i]+ax[i+1];            if (sum<ax[i+1])            {                sum=ax[i+1];            }            if (ans<sum)ans=sum;        }        printf("ans=%d\n",ans);        sum=ax[1];        ans=max(ans,sum);//这句很重要,没有这句虽然能过,但是-4 3 2这个样例过不了;        //扫一遍偶数        for (int i=2; i<n-1; i+=2)        {            sum=sum+ax[i]+ax[i+1];            if (sum<ax[i+1])            {                sum=ax[i+1];             }            if (ans<sum) ans=sum;        }        printf("%d\n",ans);    }    return 0;}


0 0
原创粉丝点击