题目描述
给定一个正数数组arr,其中所有的值都为整数,以下是最小不可组成和的概念
把arr每个子集内的所有元素加起来会出现很多值,其中最小的记为min,最大的记为max
在区间[min, max]上,如果有数不可以被arr某一个子集相加得到,那么其中最小的那个数是arr的最小不可组成和
在区间[min, max]上,如果所有的数都可以被arr的某一个子集相加得到,那么max+1是arr的最小不可组成和
请写函数返回正数数组arr的最小不可组成和
保证1一定出现过!
时间复杂度为O(n)O(n),额外空间复杂度为O(1)O(1)
输入描述:
第一行一个整数N,表示数组长度。
接下来一行N个整数表示数组内的元素。
输出描述:
输出一个整数表示数组的最小不可组成和
示例1
输入
复制
3
1 2 5
输出
复制
4
说明
3 = 1 + 2
示例2
输入
复制
5
1 2 3 4 5
输出
复制
16
因为题目保证有1的情况,结合CD 70
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
int a[100007];
long long n,k;
long long fun(int a[])
{
long long range=0;
for(int i=0;i<n;i++)
{
if(a[i]>range+1)
return range+1;
range+=a[i];
}
return range+1;
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
cout<<fun(a);
return 0;
}