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

来源:互联网 发布:淘宝买东西往哪里存钱 编辑:程序博客网 时间:2024/06/06 02:48

题目描述如下:


看到这个题目,最容易想到的是暴力搜索法。然而,那不是好的办法,也是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判断。


做最好的自己~~加油~

0 0
原创粉丝点击