题目描述
给定一个正数数组\ arr arr 和一个正数\ range range,可以选择\ arr arr 中的任意个数字加起来的和为\ sum sum。
返回最小需要往\ arr arr 中添加几个数,使得\ sum sum 可以取到1 \sim range1∼range范围上的每一个数。
给出的数组不保证有序!
输入描述:
第一行一个整数N, K。表示数组长度以及range
接下来一行N个整数表示数组内的元素
输出描述:
输出一个整数表示答案
示例1
输入
复制
4 15
1 2 3 7
输出
复制
1
说明
想累加得到1 \sim 151∼15范围上的所有的数,arr还缺14这个数,所以返回1
示例2
输入
复制
3 14
1 5 7
输出
复制
2
说明
想累加得到1~14范围上所有的数,arr还缺2和4,所以返回2。
思路:左神的数P489;
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
int a[100007];
int main()
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);//先排序
int touch=0,ans=0;
for(int i=0;i<n;i++)
{
while(touch+1<a[i])
{
touch+=touch+1;
ans++;
if( touch>=k )
{
cout<<ans;
return 0;
}
}
touch+=a[i];
if( touch>=k )
{
cout<<ans;
return 0;
}
}
while( touch<k )
{
touch+=touch+1;
ans++;
}
cout<<ans;
return 0;
}