小米oj 数组差(挺好的题)

- 数组差

序号:#46难度:困难时间限制:1000ms内存限制:10M

描述

给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组元素和的差的绝对值 |SUM(A) - SUM(B)| 最大。 返回这个最大的差值。 例如: 有一个数组{1, 2, -3, 1},可以从中找出两个子数组A = {1, 2}与B = {-3},这两个子数组的元素和分别为 SUM(A) = 3,SUM(B) = -3,因此可以求得差的最大值 |SUM(A) - SUM(B)| = 6。

输入

使用逗号(,)分隔的一个整数数组

输出

一个整数,表示两个子数组元素和的差的最大值

输入样例

1,2,-3,1

 复制样例

输出样例

6

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
char buf[1000005];
int a[1005];
int read(char *buf,int* num)
{
    int cnt=0;
    int  v;
    char *p = strtok(buf,",");
    while(p)
    {
        sscanf(p,"%d",&v);
        num[cnt++]=v;
        p = strtok(NULL,",");
    }
    return cnt;
}
int lmax[1005];
int lmin[1005];
int rmax[1005];
int rmin[1005];
int main()
{
  //  freopen("in.txt","r",stdin);
    while(~scanf("%s",buf))
    {
        int n=read(buf,a);
        int ma=-0x3f3f3f3f;int mi=0x3f3f3f3f;
        int tmp1=0;int tmp2=0;
        for(int i=0;i<n;i++)
        {
            tmp1=tmp1<0?a[i]:tmp1+a[i];
            ma=max(ma,tmp1);
            lmax[i]=ma;
            tmp2=tmp2>0?a[i]:tmp2+a[i];
            mi=min(mi,tmp2);
            lmin[i]=mi;
        }
        tmp1=0;tmp2=0;
        ma=-0x3f3f3f3f;mi=0x3f3f3f3f;
        for(int i=n-1;i>=0;i--)
        {
            tmp1=tmp1<0?a[i]:tmp1+a[i];
            ma=max(ma,tmp1);
            rmax[i]=ma;
            tmp2=tmp2>0?a[i]:tmp2+a[i];
            mi=min(mi,tmp2);
            rmin[i]=mi;
        }
        int ans=0;
        for(int i=1;i<n;i++)
        {
            ans=max(ans,abs(lmax[i-1]-rmin[i]));
            ans=max(ans,abs(lmin[i-1]-rmax[i]));
        }
        printf("%d ",ans);
    }
    return 0;
}
 

原文地址:https://www.cnblogs.com/linruier/p/9972869.html