算法与数据结构实验题 5.1 最小和

★实验任务 N 个数排成一排,你可以任意选择连续的若干个数,算出它们的和。问该如 何选择才能使得和的绝对值最小。求出绝对值最小值。
★数据输入
第一行输入整数 N,表示数字的个数。接下来 N 行描述这 N 个整数。 40%的数据 1<=N<=4000 100%的数据 1<=N<=100000,|每个数字的值|<=10^10
★数据输出
输出一行,表示和的最小绝对值。
输入示例
8
-20
90
-30
-20
80
-70
-60
125
输出示例
5


简单的前缀和应用

/*
 * minsum.cpp
 *
 *  Created on: 2016年10月7日 
 *      Author: 221500423  CJDM66
 */
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
typedef __int64 lld;
const lld MAX = 100002;
lld a[MAX];
lld sum[MAX];
bool cmp(lld a,lld b){
    return a<b;
}
int main(void){
    int i,n;
    lld num,ans;
    cin>>n;
    for(i=1;i<=n;i++){
        scanf("%I64d",&num);
        a[i]=num;
        sum[i]=sum[i-1]+a[i];
    }
    sort(sum,sum+n+1,cmp);
    ans=sum[1]-sum[0];
    for(i=0;i<n;i++){
        if(ans>sum[i+1]-sum[i]){
            ans=sum[i+1]-sum[i];
        }
    }
    printf("%I64d",ans);
    return 0; 
}

猜你喜欢

转载自blog.csdn.net/cjdm66/article/details/52960499
5.1