尺取法

顾名思义,像尺子同样取一段,尺取法一般是对数组保存一对下标,即所选取的区间的左右端点,而后根据实际状况不断地推动区间左右端点以得出答案。之因此须要掌握这个技巧,是由于尺取法比直接暴力枚举区间效率高不少,尤为是数据量大的时候,因此尺取法是一种高效的枚举区间的方法,通常用于求取有必定限制的区间个数或最短的区间等等。固然任何技巧都存在其不足的地方,有些状况下尺取法不可行,没法得出正确答案。

也能够说是,在给的一组数据中找到不大于某一个上限的“最优连续子序列”

尺取法查找大于10的思路以下图,黄色区域是每次查找的区间,第一次先找出左右端点后,固定右端点移动左端点,依次移动左端点直到没法知足的状况下更新右端点。每次比较序列长度获得最优解。
c++

例题:数组

代码:spa

#include <bits/stdc++.h>
using namespace std; #define ll long long ll p[500005]; int main() { ll s, n; cin >> s >> n; ll sum = 0; for (int i = 0; i < n; i++) cin >> p[i], sum += p[i]; if (sum < s) printf("0\n"); else { sum = 0; int l = 0, r = 0; int ans = n; while (1) { while (r < n && sum < s) //每次将右端点r推到首次知足题意的位置
                sum += p[r++]; if (sum < s) //若是已经没有知足题意的右端点(即右端点推到尽头)
                break; ans = min(ans, r - l); //过程当中不断更新答案
            sum -= p[l++];         //左端点向右推进一个单位
 } cout << ans << endl; } return 0; }
相关文章
相关标签/搜索