还是尺取法/。/

前几天打bestcode 的时候 里面有一道题目是用尺取法。。 然而。。我没看出来(主要是问题的转化过程)

先说说尺取法的使用范围吧 在一段区间里面 寻找满足条件的区间个数问题

先上题目 hdu5806 题目是求满足条件的区间个数 所以可以用尺取法 那么关键就来了 如果确定区间 这里转换一下 需要满足区间里面第k大的数不小于m 那么 我们记录不小于m的个数就好了

#include "cstdio"  
#include "iostream"  
#include "cstring"  
#include "algorithm"  
using namespace std;  
/*题意: 
07.给一个数列,给定一组m,k值,求有多少个人区间里第k大的数不小于m  
08.做法: 
09.尺取法  
10.*/  
int a[200010];  
int main()  
{  
    int T;scanf("%d",&T);  
    while(T--)  
    {  
        int n,m,k;  
      scanf("%d%d%d",&n,&m,&k);  
        //第k大的数,不小于m   
        for(int i=1;i<=n;i++)  
        {  
           scanf("%d",&a[i]);  
        }  
        int st=1,ed=0,cnt=0;  
        long long ans=0;  
        while(st<=n)//从第一个遍历到最后   
        {  
            //一旦够数,就停止加   
            while(cnt<k && ed+1<=n)  
                cnt+=(a[++ed]>=m);//满足条件为1  
           //若有k个大于m,加起来   
            if(cnt==k)   
                ans=ans+n-ed+1;  
            // 前面都已经够数了,后面怎么添都可以  
            //每走一步,如果最开头的数 大于m,减掉,继续往后找   
            cnt-=(a[st++]>=m);   
        }  
        printf("%I64d\n",ans);   
    }  
   return 0;  
}  
posted @ 2016-08-10 14:24  猪突猛进!!!  阅读(126)  评论(0编辑  收藏  举报