放寒假前在浏览博客园的时候,看到别人博客中一道关于求解数组平衡点的题目,但是由于要考试复习,所以一直拖到现在才做:
原博客地址:http://www.cnblogs.com/wanghonggang/archive/2013/01/13/2858962.html
题目大意:
数组平衡点
一个序列的平衡点是这样的,它的左边的所有的元素的和应该等于右边的所有的元素的和,比如在下面的序列A:
A[0] = -7 A[1] = 1 A[2] = 5 A[3] = 2 A[4] = -4 A[5] = 3 A[6] = 0
3是一个平衡点因为:
- A[0] + A[1] + A[2] = A[4] + A[5] + A[6]
6也是一个平衡点因为:
- A[0] + A[1] + A[2] + A[3] + A[4] + A[5] = 0
(零个元素的和是零) 索引7不是平衡点,因为它不是序列A的有效索引。
如果你仍然不是很清楚,那么这里给出了明确的定义:0 ≤ k < n 并且 sum[i=0]k-1A[i] = sum[i=k+1]n-1 A[i]。时, 整数k是序列A[0], A[1], ..., A[n−1]$ 的平衡点,这里我们假定零个元素的和为零。
请写一个函数
int equi(int A[], int N);
返回给定序列的平衡点(任意一个)如果没有平衡点则返回−1,假设这个序列可达到非常大。
假定:
- N 是 [0..10,000,000] 内的 整数;
- 数组 A 每个元素是取值范围 [−2,147,483,648..2,147,483,647] 内的 整数 .
我的做法(没有完全按照题意来做):
/* --------------------------------------------------------
* 大概思路:根据数组平衡点的定义,可以利用保存数组子段和的
* 并进行一定的处理求出数组平衡点。
*
* 时间复杂度为:O(n)
* -------------------------------------------------------- */
#include<stdio.h>
const int N = 100 ;
int a[N] ;
int main(void)
{
int i,t,n;
freopen("in.txt","r",stdin) ; //重定向到文件,方便测试
scanf("%d",&t) ;
while(t-- > 0)
{
scanf("%d",&n) ;
a[0] = 0 ;
for(i = 1 ; i <= n ; ++ i )
{
scanf("%d",&a[i]) ;
a[i] += a[i-1] ; //保存子段和
}
for(i = 1 ; i <= n ; ++i)
{
if(1 == i && 0 == a[N] - a[1]) //判断数组第一个元素是否平衡点,算是特殊情况
{
printf("%d is a Equilibrium point.\n",i) ;
}
else if(n == i && 0 == a[n-1]) //判断数组最后一个元素是否平衡点
{
printf("%d is a Equilibrium point.\n",i) ;
}
else if(a[i-1] == a[n] - a[i]) //一般情况
{
printf("%d is a Equilibrium point.\n",i) ;
}
}
printf("\n*************\n") ;
}
return 0 ;
}