题目描述
给定 n 个数字a1,a2,a3,…,an,请将它分成两个连续的子串,使得两个子串和相差最小,输出最小的差值。
输入格式
- 第一行,单个整数 n
- 第二行,n 个整数 a1,a2,…,an
输出格式
单个整数:表示两个子串总和之差的最小值。
数据范围
- 对于 30%30% 的数据,1≤n≤100
- 对于 70%70% 的数据,1≤n≤10000
- 对于 100%100% 的数据,1≤n≤100000
- 1≤ai≤10000
样例数据
输入:
3
100 1 1
输出:
98
说明:
100-(1+1)
输入:
6
1 2 3 4 5 6
输出:
1
说明:
(5+6)-(1+2+3+4)
解析
本题关键点:分别计算前面数字之和和后面数字之和,如果前面和少就给前面加数字,反之亦然。代码如下。
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n;
cin>>n;
int a[n];
for(int i=1;i<=n;i++){
cin>>a[i];
}
int l=1;
int r=n;
int lsum=a[1];
int rsum=a[n];
while(r-l>1){
if (lsum<rsum){
l++;
lsum+=a[l];
}else{
r--;
rsum+=a[r];
}
}
cout<<abs(lsum-rsum)<<endl;
return 0;
}