zoukankan      html  css  js  c++  java
  • HDU 吉哥系列故事——完美队形II 騰訊馬拉松初賽第二輪D題

    吉哥系列故事——完美队形II

    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
    Total Submission(s): 354    Accepted Submission(s): 99


    Problem Description
      吉哥又想出了一个新的完美队形游戏!
      假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让这些人形成一个新的队形,新的队形若满足以下三点要求,则就是新的完美队形:

      1、挑出的人保持原队形的相对顺序不变,且必须都是在原队形中连续的;
      2、左右对称,假设有m个人形成新的队形,则第1个人和第m个人身高相同,第2个人和第m-1个人身高相同,依此类推,当然如果m是奇数,中间那个人可以任意;
      3、从左到中间那个人,身高需保证不下降,如果用H表示新队形的高度,则H[1] <= H[2] <= H[3] .... <= H[mid]。

      现在吉哥想知道:最多能选出多少人组成新的完美队形呢?
     
    Input
      输入数据第一行包含一个整数T,表示总共有T组测试数据(T <= 20);
      每组数据首先是一个整数n(1 <= n <= 100000),表示原先队形的人数,接下来一行输入n个整数,表示原队形从左到右站的人的身高(50 <= h <= 250,不排除特别矮小和高大的)。
     
    Output
      请输出能组成完美队形的最多人数,每组输出占一行。
     
    Sample Input
    2 3 51 52 51 4 51 52 52 51
     
    Sample Output
    3 4
     
    Source
     
    Recommend
    liuyiding
     
    分析:
      很多人都用擴展KMP,不懂。。。
      其實這題有一個很好的暴力思路。。。
      
      1.我們把連續相同的合併,然後算出該合併塊的大小。
      2.統計這k個合併塊的前驅和。
      3.“暴力”枚舉中間的最高點,然後向兩邊的合併塊擴展(按照題目給出的約束條件),注意若是兩邊的合併塊大小不一樣,就取最小的那塊,然後不能夠再往兩邊擴展。更新答案。
     
      算法複雜度:O(n)   !
      爲什麽?因為每兩個相鄰的合併塊都是不同元素的,肯定是一個嚴格單調的關係,所以我們每次枚舉中間點的時候,能夠往兩邊擴展的範圍很小。若是很大的話,那麼,我們其實就可以跳到上一次可以擴展到的最右位置了(因為上次的最高點到該位置都是滿足單調遞減的。。。)  
      
      注意的是:擴展的時候需要注意兩邊的合併塊的大小是否相同。代碼略。。。
      
    7862855 2013-03-24 10:36:45 Accepted 4513 390MS 1100K 2939 B G++ yejinru
     
     
     
  • 相关阅读:
    vue 中的单元测试
    redux-学习总结
    React-学习总结
    vuecli 中 chainWebpack 的常用操作
    常用 vue-config.js 配置
    JavaScript 中的 MVC、MVP、MVVM
    日常工作中 @vue/cli 需要关注的一些配置
    Electron 构建超时问题
    JSBridge 原理与封装
    Three.js 之相机
  • 原文地址:https://www.cnblogs.com/yejinru/p/2979428.html
Copyright © 2011-2022 走看看