码迷,mamicode.com
首页 > 编程语言 > 详细

小算法---寻找最小的不能由n个数选取求和的数

时间:2016-08-14 02:06:13      阅读:378      评论:0      收藏:0      [点我收藏+]

标签:

题目描述如下:技术分享


看到这个题目,最容易想到的是暴力搜索法。然而,那不是好的办法,也是acm无法通

过的办法。

思路分析:对于给定的数组,我们必须先对其进行小到大的排序。如果最小的数不是

1(大于1),输出的结果必然就是1啦。如果是1,通过当前数与前边所有数的和加1进

行比较,如果当前数小于等于前边数的和加1,那么当前数也是可以找到它的几个因数

的;否则,直接返回前边数的和加1.跳出循环的有两种情况,break和循环终止条件,如

果是终止条件出来的,那就是说明从1到数组中所有元素的和,都可以找到它的因子,

此时返回所有数的和加1即可。

【源代码】

#include<stdio.h>
#include<malloc.h>

void sort(int arr[], int num)
{
	int i = 0;
	int j = 0;
	int tmp = 0;
	for (i = 1; i < num; i++)
	{
		int m = arr[i];
		for (j = i - 1; (j >= 0) && (arr[j] > m);j--)
		{
			arr[j + 1] = arr[j];
		}
		arr[j + 1] = m;
	}
}
int fun(int arr[], int num)
{
	int i = 0;
	int  r = 0, ans = -1;
	/*if (arr[0] != 1)
		return 1;*/
	for (int i = 0;i< num ;i++)
	{
		int tl =  arr[i], tr = r + arr[i];
		if (tl <= r + 1)
		{
			r = tr;
		}
		else
		{
			ans = r + 1;
			break;
		}
	}
	if (ans == -1) ans = r + 1;
	return ans;
}
int main()
{
	int *arr = NULL;
	int num = 0;
	int i = 0;
	scanf("%d",&num);
	if (num <= 0)
	{
		printf("input error");
		return 0;
	}
	arr = (int *)malloc(num * sizeof(int));
	if (NULL == arr)
	{
		printf("out of memory\n");
		return 0;
	}
	for (i = 0; i < num; i++)
	{
		scanf("%d",&arr[i]);
	}
	sort(arr,num);
	int ret = fun(arr, num);
	printf("%d",ret);
	return 0;
}


通过代码,我们发现,如果数组的最小元素不是1,仍然可以通过for循环判断出来,不

需要fun函数中最前边的if判断。


做最好的自己~~加油~

小算法---寻找最小的不能由n个数选取求和的数

标签:

原文地址:http://blog.csdn.net/peiyao456/article/details/52201968

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!