贪心算法-求区间至少连续k的最大和

求解区间内至少连续k个数的最大和
本文探讨了一种算法,用于在给定范围内找到至少包含k个连续整数的最大和。通过分析和优化,实现了一个高效的方法来解决这一问题。

题意:对于一个整数n,表示该区间整数的个数,求至少有k个连续的数是该区间中一段的最大和。

n的范围在1~10^6。k(-1000~1000);

分析:这道题看似有点像树状数组,但要想求出区间至少有k个连续的数的和是最大,恐怕是有点难度,顶多是求某一区间的和。

不过可以沿着这个思路想,sum(n)-sum(i)?。

如果这样想,我们就要判断n-i>=k;那换种思路:在第i的前面寻找最小值,在i+k的后面寻找最大值。这样sum(n)-sum(i)一定是第i个循环中最大的一个。

对于每次这样循环,我只要定义一个变量来接收一个最大值(sum(n)-sum(i))把它与下一个做比较就行了。

思路清晰了,代码应该就好写了。

#include<cstdio>
#include<iostream>
using namespace std;
int n,k;
int a[1000005];
int INF=0x7fffffff;
void maxsum()
   {  
      int l=INF;                              //值最大,能把值传递给l(小于它的值)。
      int r=INF+1;                            //值最小,能把值传递给r(大于它的值)。
     for(int i=k;i<=n;i++)
      {
	    l=l<a[i-k]?l:a[i-k];      //在i-k个前面检测最小的值,每次i++;比较的范围至少相差k个。
        r=r>a[i]-l?r:a[i]-l;      //在i个以后检测最大值。
	 }                           
     cout<<r<<endl; 
}
int main()
{    
    while(scanf("%d%d",&n,&k)!=EOF)
	{
     for(int i=1;i<=n;i++)
     {
       cin>>a[i];
       a[i]+=a[i-1];
     }
	 maxsum();
	}
     return 0;
}
       


### 关于贪心算法的练习题及相关资源 贪心算法是一种通过局部最优选择来达到全局最优解的方法,在实际应用中有广泛的应用场景。以下是针对头歌平台以及教材中的贪心算法练习题和相关资源的内容整理。 #### 头歌平台上的贪心算法练习题 头歌平台上提供了丰富的编程实践题目,其中涉及贪心算法的部分可以帮助学习者深入理解该算法的核心思想及其应用场景。例如: - **找零问题** 找零问题是经典的贪心算法示例之一,其核心在于如何利用最少数量的硬币完成支付目标金额的任务[^1]。此问题可以通过逐步选取当前面额最大的硬币并减少剩余金额的方式解决。 - **跳跃游戏** 跳跃游戏的目标是从数组的第一个位置跳到最后一个位置,判断是否存在一种方法能够成功到达终点。对于此类问题,可以采用动态规划或者贪心策略解。具体而言,维护一个变量记录当前能到达的最大索引即可。 #### 力扣(LeetCode)上的经典贪心算法题目 除了头歌平台外,力扣也是一个非常优秀的在线刷题网站,它包含了大量高质量的数据结构与算法挑战题。下面列举几个典型的例子供参考: - **按身高重建队列** 此题要按照特定规则重新排列一组人员的位置关系。解决方案通常先将数据排序再逐一插入到合适的地方形成最终序列[^3]。 - **最大化数组总和** 对给定整数列表执行最多`k`次取反操作使得最后得到的结果尽可能大。这类优化类别的问题往往适合运用贪婪思维模式去处理[^2]。 - **最大子序和** 寻找连续子数组使其元素之和达到最高值。这属于区间型最值查询范畴内的基础模型之一[^4]。 - **最小覆盖箭数** 计算至少需要多少支箭才能击破所有位于二维平面上的不同圆形区域表示出来的气球对象。解答过程里会涉及到对输入坐标集合做适当预处理后再实施分配决策逻辑步骤[^5]。 #### 推荐书籍与资料 为了更全面掌握贪心算法的知识体系,建议阅读以下几本权威著作: - *《Introduction to Algorithms》* by Thomas H. Cormen et al. - *《Algorithm Design Manual》* by Steven S. Skiena 这些书不仅讲解详尽而且配有众多实例分析可供模仿演练从而加深印象巩固记忆效果。 ```python def maxSubArray(nums): current_sum = nums[0] best_sum = nums[0] for num in nums[1:]: current_sum = max(num, current_sum + num) best_sum = max(best_sum, current_sum) return best_sum ``` 上述代码片段展示了如何使用贪心法计算出任意一维向量里的最佳连续部分累加值得情况下的实现方式。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值