背包 | ||||||
| ||||||
Description | ||||||
DS最近刚学会了背包。比如,给一个序列,问是否存在一个子集满足元素和为 X , DS 会用一种方法:
xiaodao 觉得 DS 非常聪明,不过她想难为一下DS。 她给了DS一个序列,序列中有 N(N
≤107)个正整数,满足1≤A1 ,Ai≤Ai+1,Ai≤109 | ||||||
Input | ||||||
第一行是一个整数 T 代表数据组数,以下是 T 组数据。 | ||||||
Output | ||||||
对于每组数据,输出一个整数 Y 代表本组数据的最小不可构造数。 | ||||||
Sample Input | ||||||
3 3 1 2 4 2 2 100000 4 1 2 3 4 | ||||||
Sample Output | ||||||
8 1 11 | ||||||
Hint | ||||||
对于第一组样例
对于第三组样例
|
对于这个题,直接的思路就是枚举子集,然后因为数据量太大,一维数组根本就是RE到死,所以没办法、、、、最后参考了大牛的思路:是这样的、
题目保证了数据的递增性,所以我们这里不必要担心要不要sort的问题,sum是一个计入总和的变量,如果sum+1<a【i】,那么sum+1是一定会空缺出来没有任何数据的和能够等于sum+1,根据这两个特性,就能对应写出代码:
#include <stdio.h>
#include <string.h>
using namespace std;
int a[10000005];
int main()
{
int i,j,n,t;
long long int sum;
scanf("%d",&t);
while(t--)
{
sum = 0;
scanf("%d",&n);
for(i = 0;i<n;i++)
scanf("%d",&a[i]);
sum = 0;
for(i = 0;i<n;i++)
{
if(sum+1<a[i])
break;
sum+=a[i];
}
printf("%lld\n",sum+1);
}
return 0;
}