码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 5806 NanoApe Loves Sequence Ⅱ ——(尺取法)

时间:2016-08-23 22:01:56      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:

  题意:给出一个序列,问能找出多少个连续的子序列,使得这个子序列中第k大的数字不小于m。

  分析:这个子序列中只要大于等于m的个数大于等于k个即可。那么,我们可以用尺取法写,代码不难写,但是有些小细节需要注意(见代码注释)。我觉得,《挑战程序设计》里的尺取法的内容需要好好的再回顾一下= =。

  代码如下:

 1 #include <stdio.h>
 2 #include <algorithm>
 3 #include <string.h>
 4 using namespace std;
 5 typedef long long ll;
 6 const int N = 200000 + 5;
 7 
 8 int a[N];
 9 
10 int main()
11 {
12     int T;scanf("%d",&T);
13     while(T--)
14     {
15         int n,m,k;scanf("%d%d%d",&n,&m,&k);
16         for(int i=1;i<=n;i++) scanf("%d",a+i);
17         int s = 1, t = 1, num = 0;
18         ll ans = 0;
19         for(;;)
20         {
21             while(num<k && t<=n)
22             {
23                 if(a[t++] >= m)
24                 {
25                     num++;
26                 }
27             }
28             //if(t>n) break;
29             if(num < k) break;
30             // 必须采取下面的写法,不然会WA
31             // 因为可能即使 t>n 出来此时刚好也 num==k 了,必须再加一次。
32             // 也可以为了保险,在下面这个语句前面加上 if(num >= k)
33             ans += n-t+2;
34             if(a[s++] >= m) num--;
35         }
36         printf("%I64d\n",ans);
37     }
38 }

 

HDU 5806 NanoApe Loves Sequence Ⅱ ——(尺取法)

标签:

原文地址:http://www.cnblogs.com/zzyDS/p/5800839.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!