C语言萌新求教,请问一下这个程序的结果为什么是5051啊,直接int sum和int sum=1的结果为什么不同呢?

萌新又来写笔记啦 原因是做完CF的C题需要用到尺取法
“尺取法通常是对数组保存一对下标,即所选取的区间的左右端点,然后根据实际情况不断地推进区间左右端点以得出答案”

题意:给定一个序列,使得其和大于或等于S,求***最短***的子序列长度。
尺取法的模板题。借助这个题深入理解以下“尺取”。
思路:一开始让左右指针都指向最左端,然后右指针++,直到找到sum > S(找到最右端也不满足,无解)。然后左端指针++,并每次判断是否符合题意。
也就是说,我们***在对所选取区间进行判断之后,可以明确如何进一步有方向地推进区间端点以求解满足条件的区间***

题意:要看完所有的知识点,这本书共有P页,第i页恰好有一个知识点ai,(每一个知识点都有一个整数编号)。全书同一个知识点可能会被提到多次,他希望阅读其中一些连续的页把所有知识点都读到,给定每页所读到的知识点,求最少的阅读页数 .
思路:注意到“连续页数”,考虑使用尺取法。把知识点用map保存,具体细节见代码。

题意:一个数字能是否能用若干个(或许是一个)连续的素数之和表示,并且想知道有多少种方法。例如,53 有两种表示方法 5 + 7 + 11 + 13 + 17 和 53。 现在给你一个整数 n,你要告诉他这个数字有多少种不同的连续素数和表示方式。
思路:素数打表之后直接尺取。相当于问:给一个数组,求连续一段的和等于某个值,就是A题把大于变成等于。

题意:结界给出一个数n。你要求一段连续的数,这些数的平方和等于n。
思路:例如:满足2030的解有2个 第一个解包含4个数 分别是 21 22 23 24。第二个解包含3个数 分别是 25 26 27。
算到根N就可以!剩下的肯定更大啦!
和C题类似,把等于换成了平方等于。

题意:给定一个数组和一个值t,求一个子区间使得其和的绝对值与t的差值最小,如果存在多个,任意解都可行。
注意这个题不可以直接用尺取法哦!因为正负相间,而且是看绝对值。如果满足绝对值大于t了,也不能直接让左指针右移(因为可能有更优解)!(例如当前的值是-25,t是20,右指针下一个数是5,虽然绝对值大了,但是不可以直接让左指针动~之前的题都是正数,超过之后怎么加正数肯定更大!)
题意:给出一个长度为 n 的数组 a,抛出 good 数组的定义:
good 数组为数组 a 的一个子数组
good 数组的任意子数组之和均不为 0。求good数组的个数。
2*10^5,不可能用n2算法~ 一开始写的是假算法+超时(一个个看,树状数组)
用map、前缀和辅助。【这里有一个结论,如果某两个位置的前缀和相同,那么这两个位置之间的数和为0】。我们用map[x]记录上一个前缀和为x的位置,并不断更新。见图!


}

我要回帖

更多关于 什么是萌新 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信