小算法---寻找最小的不能由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
- 小算法---寻找最小的不能由n个数选取求和的数
- hdu4104-N个数不能组成的最小的数
- 选取部分求和的数字中的最小数
- 算法---寻找最小的k个数
- 寻找 最小的k个数 线性选择算法 平均时间复杂度 O(n)
- 寻找最小的k个数 时间复杂度 O(n*k)
- 常见面试算法题:N个数中寻找仅出现过1次的数
- 给定一个N位的数,返回由这N个数组成的比原来的数大数中的最小的数
- 给定一个N位的数,返回由这N个数组成的比原来的数大数中的最小的数
- 寻找一组数中最小的k个数
- O(n)时间复杂度求最小的k个数和第k小的数
- 寻找最小的k个数
- 寻找最小的k个数
- 寻找最小的K个数
- 寻找最小的k个数
- 寻找最小的K个数
- 寻找最小的k个数
- 寻找最小的k个数
- 【bzoj2002】【Hnoi2010】【Bounce】【弹飞绵羊】【分块】
- @ManyToMany 映射
- mybatis基础知识——学习笔记(1)
- Java ClassLoader深入解析(一)
- 注解基础
- 小算法---寻找最小的不能由n个数选取求和的数
- SIM71004G模块使用Linux C语言实现打电话发短信
- Android开源:数据库ORM框架GreenDao学习心得及使用总结
- MMAP TOOL Design
- LeetCode 108. Convert Sorted Array to Binary Search Tree
- NFS ROOT 启动内核的配置(UBoot)
- 数据库锁机制
- tjut 2896
- 161009_qt显示阿拉伯输入法9x7点阵