尺取算法
总结:就如之前例题的博客所说,又可以生动的叫它毛毛虫算法,其命名不是没有道理的,此算法的原理就如毛毛虫一般,一步一步的往后蠕动,多说无益,直接看例题。
描述冬日里的一抹暖阳总是能给人们留下深刻的记忆,人们喜爱冬天的太阳,就跟人们喜爱冬天的火锅一般。
寒冷的冬天总会让人想起火锅,最近小Z特别想去吃火锅,刚好某家转转火锅刚开业有活动,有n盘火锅围成一个圈,第一盘和最后一盘是相连的,每一盘火锅都有一个价值a[i],现在可以吃连续的m盘火锅,小Z想知道他所吃的那连续的m盘火锅的最大价值可以是多少?你能帮帮憨憨的小Z吗。
格式输入格式第一行数入两个整数n,m(1<=m<=n<=2000000),分别表示火锅的盘数和可以吃的连续的盘数
第二行输入n的数ai,分别表示每一盘火锅的价值
输出格式输出一个整数,表示连续m盘火锅的最大价值样例样例输入
Copy
5 3
6 1 2 5 3
样例输出
Copy
14
核心代码
long long int sum=0,w=0,t=0,ans=0,p=m;//此题目需要long long ,注意范围,之前就错在这里。
while(w<n)//我从0开始,直到w等于n,此时刚好走一圈,就把里面的所有的连续组合都走到了
{
if(t==0)
{
while(t<m)//这里是是计算前面m个的总和。
{
sum+=a[t++];
}
}
else
{
sum=sum+a[p++];//这里是每次往后加一个。
}
if(p>=n)
p=0;//此处很关键,如果‘毛毛虫’的头到了最后,它就要网尾部走了,就是在试最后的与前面的相加。
if(ans<sum)
ans=sum;
sum=sum-a[w++];//这里‘毛毛虫’长度是控制的,所一头往前走了,尾巴也要往前走
}
我觉得吧,此题目的关键就在第一个while(w<n),多数时候网网会忽略,导致范围不全;