ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

尺取法

2019-10-03 15:57:15  阅读:205  来源: 互联网

标签:知识点 int res while solve 取法


反复推进区间的开头与末尾,这样的方法叫做尺取法,求给定长度内的最短区间可以满足某些性质。


 

POJ3061

题意:

给定长度为 n 的数列整数,以及整数 S ,求出总和不小于 S 的连续子序列的长度的最小值.如果解不存在则输出 0 。

解:

不断的推进首位,每推进一次首位,就往后推近末尾直到区间序列的和大于等于S。

 1 int N, S;
 2 int a[MAXN];
 3 
 4 void solve() {
 5     int res = N + 1;
 6     int s = 1, t = 1, sum = 0;
 7     for (;;) {
 8         while (t <= N && sum < S) {
 9             sum += a[t++];
10         }
11         if (sum < S) break;
12         res = min(t - s, res);
13         sum -= a[s++];
14     }
15     if (res > N) res = 0;
16     printf("%d\n", res);
17 }
18 
19 int main() {
20 #ifndef ONLINE_JUDGE
21     freopen("input.txt", "r", stdin);
22 #endif
23     int T = READ();
24     while (T--) {
25         CLR(a);
26         scanf("%d %d", &N, &S);
27         REP(i, 1, N) scanf("%d", &a[i]);
28         solve();
29     }
30     return 0;
31 }

POJ3320

题意:

一本书总共有 P 页,第 i 页有一个知识点 $a_i$ (每个知识点都有一个编号),求最少读连续的多少页就可以掌握所有知识点

解法:

尺取法,用一个单独的变量维护当前读过的区间内的知识数,判断其与知识总数是否相等,若相等则更新答案,否则继续推。

 1 int P;
 2 int a[MAXN];
 3 set<int> all;
 4 
 5 void solve() {
 6     int num = all.size();
 7     int s = 1, t = 1, sum = 0;
 8     int res = P;
 9     map<int, int> count;
10     for (;;) {
11         while (t <= P && sum < num) {
12             if (count[a[t++]]++ == 0) sum++;
13         }
14         if (sum < num) break;
15         res = min(t - s, res);
16         if (--count[a[s++]] == 0) sum--;
17     }
18     printf("%d\n", res);
19     return;
20 }
21 
22 int main() {
23 #ifndef ONLINE_JUDGE
24     freopen("input.txt", "r", stdin);
25 #endif
26     scanf("%d", &P);
27     for (int i = 1; i <= P; i++) {
28         scanf("%d", &a[i]);
29         all.insert(a[i]);
30     }
31     solve();
32     return 0;
33 }

 

标签:知识点,int,res,while,solve,取法
来源: https://www.cnblogs.com/romaLzhih/p/11619882.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有