贪心之补丁数组(详细分析)

    技术2022-07-11  119

    题目描述

    给定一个长度为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); }
    Processed: 0.014, SQL: 9