题目描述
给定一个长度为l的有序非负整数列nums和一个整数n,最少需要添加多少个数可以使得[1,n]间的每一个数都可以被数列中若干个数的和来表示。(数组中的元素不能重复使用)
输出最少需要添加多少个数字。
输入格式
共计两行。
第一行:两个整数l和n,分别代表数列nums的长度和整数n。(l不大于10^5,n不大于INT_MAX)第二行:l个有序非负整数。(每个数不大于10^4)
输出格式
最少需要添加的数字个数
样例
样例1输入
2 6
1 3
样例1输出
1样例2输入
3 20
1 5 10
样例2输出
2
算法分析
本题要采用贪心算法,让使用的补丁最少,且能覆盖范围内的所有值,达到最简的。
代码
#include <cstdio>
#include <algorithm>
using namespace std;
const int M = 10000005;
int a[M];
int main() {
int n, m;
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
int sum = 0, ans = 0;
for (int i = 1; i <= n;) {
if (sum >= m) {
break;
} else if (sum + 1 < a[i]) {
ans++;
sum += sum + 1;
} else {
sum += a[i];
i++;
}
}
while (sum < m) {
ans++;
sum += sum + 1;
}
printf("%d", ans);
}