尺追法
来源:互联网 发布:淘淘商城 源码 编辑:程序博客网 时间:2024/05/29 17:47
我们先来介绍一下尺取法。尺取法,顾名思义,像尺子一样,一块一块的截取。是不是解释的有点让人纳闷~。。没关系,下面我们通过这个题目来体会尺取法的魅力。
原文在这里:http://blog.chinaunix.net/uid-24922718-id-4848418.html
题目翻译:
给定长度为n的数列整数a0,a1,a2,a3 ..... an-1以及整数S。求出综合不小于S的连续子序列的长度的最小值。如果解不存在,则输出0。
限制条件:
10<n<10^5 <="" p="" style="word-wrap: break-word;">
0<ai<10^4 <="" p="" style="word-wrap: break-word;">
S<10^8
这里我们拿第一组测试数据举例子,即 n=10, S = 15, a = {5,1,3,5,10,7,4,9,2,8}
这幅图便是尺取法怎么“取”的过程了。
整个过程分为4布:
1.初始化左右端点
2.不断扩大右端点,直到满足条件
3.如果第二步中无法满足条件,则终止,否则更新结果
4.将左端点扩大1,然后回到第二步
用尺取法来优化,使复杂度降为了O(n)。
最后,再给一个尺取法的定义以便更好理解:返回的推进区间开头和结尾,求满足条件的最小区间的方法称为尺取法。
以上为网上关于尺取法的原理介绍,还是比较好理解的,邢如蚯蚓的爬动。
直接上代码:
点击(此处)折叠或打开
- #include "stdafx.h"
- #include <set>
- #include <map>
- #define MAXN 10
- #define S 11
- #define min(x,y) (x>y?y:x)
- int sequence[MAXN] = {5,1,3,5,10,7,4,9,2,8};
- int slove(int sequence[])
- {
- int s = 0, t = MAXN , sum = 0 , i = 0;
- int res = MAXN + 1;
- while (1)
- {
- while (sum < S && i < MAXN)
- {
- sum += sequence[i++];
- }
- if (sum < S)
- {
- return res;
- }
- if (res > MAXN)
- {
- printf("not find \n");
- return res;
- }
- res = min(res,(i - s));
- sum -= sequence[s];
- s++;
- }
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- int res = slove(sequence);
- printf("res is %d\n",res);
- return 0;
- }
1 0
- 尺追法
- Codeforces Round #364 div.2 C. They Are Everywhere 【尺追法】
- 我也要开始写博客,争取当一个技术大牛
- retrofit2+okhttp3+ rxjava 遇到的问题及解决方案
- 今天用Fragment,结果继承Fragment的类出现了replace始终报错的问题
- Android开发常见问题之Process 'command 'D:\Java Jdk\java\bin\java.exe'' finished with non-zero exit value 2
- Android adb 命令
- 尺追法
- react native第三方组件问题
- C# Oracle数据库操作类实例详解
- 函数返回值 返回引用
- 当表单中中只有一个文本框类型的的input
- Ubuntu16.04下MySQL的安装与配置(UTF8)
- spring mvc 在Web.xml中自动扫描Spring的配置文件及resource时classpath*:与classpath:的区别
- hdu5761Rower Bo(计算几何)
- 如何下载卫星影像和等高线叠加