• hdu4908 中位数子串


    题意:
          给你N个数字组成的数列,然后问你这里面有多少个是以M为中位数的子序列。


    思路:

          首先分四中简单的情况求
           (1) 就是只有他自己的那种情况 那么sum+1
           (2) 从自己开始向左延伸,x, x - 1, x - 2 ...这种可以记录大于m的个数max和小于m的个数min当两个数相等的时候(min == max)就 sum++,然后在这样 mark[max - min]++;记录差值产生的次数,可以开两个数组,一个寸正差,一个存负差,或者直接开一个容器,我开的是容器,这个地方随意

           (3) 从自己开始向又延伸,跟上面的操作一样,唯独就是在mark[max - min]++那不一样,这一步不用记录差值的出现次数,而是直接算 sum += mark[min-max],这里很简单,就是优化了暴力,这个题目如果直接暴力是O(n^2)的,这样算出来是O(N)的。不是很难理解就不多解释了,还不懂得看看下面的代码就懂了,水题一道。

    #include<stdio.h>
    #include<map>
    
    #define N 44000
    
    using namespace std;
    
    map<int ,int>mark;
    
    int num[N] ,L[N] ,R[N];
    
    int main ()
    {
       int sum ,n ,m ,i ,mk;
       while(~scanf("%d %d" ,&n ,&m))
       {
          for(i = 1 ;i <= n ;i ++)
          {
             scanf("%d" ,&num[i]);
             if(num[i] == m) mk = i;
          }
          mark.clear();
          sum = 0;                 
          int min = 0,max = 0;
          for(i = mk + 1 ;i <= n ;i ++)
          {
             num[i] < m ? min++ : max++;
             if(min == max) sum ++;
             mark[max - min] ++;
          }
          min = 0 ,max = 0;
          for(i = mk - 1 ;i >= 1 ;i --)
          {
             num[i] < m ? min ++ : max ++;
             if(min == max) sum ++;
             sum += mark[min - max];
          }
          printf("%d
    " ,sum + 1);
       }
       return 0;
    }
    

  • 相关阅读:
    大数据方向招人难啊!!
    .netcore 急速接入第三方登录,不看后悔
    T-SQL——函数——时间操作函数
    T-SQL——关于XML类型
    机器学习方法
    可读性友好的JavaScript:两个专家的故事
    快速了解 JavaScript ES2019 的五个新增特性
    了解 Vue 的 Compsition API
    使用 JavaScript 操作浏览器历史记录 API
    JavaScript ES 模块:现代化前端编程必备技能
  • 原文地址:https://www.cnblogs.com/csnd/p/12062901.html
Copyright © 2020-2023  润新知