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
     
     
     
  • 相关阅读:
    鼠标移上,内容显示
    Jquery横向菜单和纵向菜单的收起与展开
    适配不同大小浏览器——固定排班
    jQuery UI Widgets-menu
    Web前端的35个jQuery小技巧-转载
    android中listview中包含ratingbar响应不了点击事件
    点击空白区域,键盘向下收缩
    时间轮 Dialog 最简单的时间轮
    android 获取电话本中的联系人列表
    《网红经济》读后感
  • 原文地址:https://www.cnblogs.com/yejinru/p/2979428.html
Copyright © 2011-2022 走看看