zoukankan      html  css  js  c++  java
  • 还是尺取法/。/

    前几天打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
    ",ans);   
        }  
       return 0;  
    }  
  • 相关阅读:
    java 多线程2
    java 多线程1
    java Object
    java 模板
    03015_JSTL技术
    运维人员常用的Linux命令总结
    oracle的userenv和nls_lang详解
    Oracle字符集检查和修改
    sql语句中(+)的作用
    Oracle事务Transaction
  • 原文地址:https://www.cnblogs.com/z1141000271/p/5756580.html
Copyright © 2011-2022 走看看