数组平衡点

放寒假前在浏览博客园的时候,看到别人博客中一道关于求解数组平衡点的题目,但是由于要考试复习,所以一直拖到现在才做:

原博客地址: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 ;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值