贪心算法解决数的补充最优解的问题||补丁数组
2019-03-07 14:18
92 查看
补丁数组|Turing
Description
给定一个长度为l的有序非负整数列nums和一个整数n,最少需要添加多少个数可以使得[1,n]间的每一个数都可以被数列中
若干个数的和来表示。(数组中的元素不能重复使用)
输出最少需要添加多少个数字。
Input
共计两行。
第一行:两个整数l和n,分别代表数列nums的长度和整数n。(l不大于10^5,n不大于INT_MAX)
第二行:n个有序非负整数。(每个数不大于10^4)
Output
最少需要添加的数字个数。
输入样例 1
[code]2 6 1 3
输出样例 1
[code] 1 Combinations of nums are [1], [3], [1,3], which form possible sums of: 1, 3, 4. Now if we add/patch 2 to nums, the combinations are: [1], [2], [3], [1,3], [2,3], [1,2,3]. Possible sums are 1, 2, 3, 4, 5, 6, which now covers the range [1, 6]. So we only need 1 patch. nums的组合是[1],[3],[1,3],它们形成可能的总和:1,3,4。 现在,如果我们将/补丁2添加到nums,则组合为:[1],[2],[3],[1,3],[2,3],[1,2,3]。 可能的总和是1,2,3,4,5,6,现在涵盖范围[1,6]。 所以我们只需要1个补丁。
输入样例 2
[code]3 20 1 5 10
输出样例 2
[code]2 The two patches can be [2, 4]. 这两个补丁可以是[2,4]。
输入样例 3
[code]3 5 1 2 2
输出样例 3
[code]0
Language:
C++
思想
本题需采用贪心算法,试让使用的补丁最少,且能覆盖范围内的所有值,达到最简的目的。
最开始首先想象到的就是依次枚举题目给定数组之外的数,并判断是否满足条件。但是细读题目可以发现(l不大于10^5,
n不大于INT_MAX),l的范围可以接受,但是n的范围开数组是肯定超出题目限制了,会Runtime Error 或者是Time limit
exceed。
所以穷举是肯定不行了,我们就改变下思路,每次判断的位置后移,判断当前位置的数加上前置和是否会超出题目的n的
范围,如果没有,就继续,再判断一下是否这个和满足了当前范围,其中没有数的遗漏,如果有,就再申请一个适当的数
并进行判断。直到和sum>=n,就break
代码
[code]#include<cstdio> int main() { int n,i,j,l,nums[100005],sum=0,ans=0,wz=1; scanf("%d%d",&l,&n); for(i=1;i<=l;i++) scanf("%d",&nums[i]); for(;;) { if(sum>=n) break; for(;;) if(wz<=l&&nums[wz]<=sum) sum+=nums[wz++]; else break; if(wz<=l&&nums[wz]==sum+1) wz++; else ans++; } printf("%d",ans); }
相关文章推荐
- 字符串数组的初始化问题(补充解决办法)
- C语言将数组中元素的数排序输出的相关问题解决
- 分治法解决最大子数组问题 (C/C++)
- [乐意黎原创]PHP里由于数组编码导致json_encode输出为空白问题的解决方法
- 解决Foxmail开机自动启动问题的补充-自启动任何程序
- 针对上篇关于 WebKit 内核浏览器的Image.loading 问题的补充。我的问题完美解决!
- 解决mantis2.4.0 htmlentities只能是字符串但是传入一个数组的问题
- MyBatis的foreach语句详解,可解决界面传输的数组对象参数问题
- Leetcode121.+Leetcode53. Kadane算法解决最大子数组问题
- 0-1背包问题,用滚动数组,动态规划解决
- 分治策略解决最大子数组问题
- 数组解决约瑟夫环问题
- java rest框架jersey数组单记录问题解决
- 解决在MyEclipse下生成的web.xml中加入taglib时报错的问题[转来的补充]
- 贪心算法求解存放磁带问题(vector数组键盘输入,C++sort函数)
- Android中onTouchEvent的返回return super.onTouchEvent(ev);数组越界问题解决方法.。。
- 一种高效率的排序方法-归并排序的实现(主要解决matlab中多维数组排序的问题)
- java-基础入门-泛型数组列表-解决运行时动态更改数组的问题
- Linux 环境下思源黑体字体与 Java 之间的兼容性问题的解决(补充说明)
- C++解决大数组栈内存不够问题的方法分析