戰術遮擋(烽火筆試第二題)


題目描述
  人的視力不能看到掩體之后的事物,在一場戰爭中,我們希望對方盡可能的低估我方的戰斗力這樣才能出其不意。

  某個軍事參謀效仿孫臏,把某些小規模隊隱藏在大規模部隊中,這樣,就使得軍隊數量看起來變少了。已知,如果某部隊A的人數小於等於另一支部隊B人數的1/3, 則可以將A藏於B中,且不被人發現。不支持嵌套,例如A小於B的三分之一,可將A藏於B, 如果又存在B是C的三分之一,不可再將B藏於C。

  現在已知我方共有n支部隊,且知道每支部隊的人數,請問,在最優方案下,我們暴露給敵人的部隊數量有幾支。
輸入描述

  輸入第一行包含一個正整數n,表示我方有n支部隊(1<=n<=50000)
  第二行有n個整數,表示每支部隊的人數,中間用空格隔開。

輸出描述

  輸出僅包含一個整數, 表示最少的部隊數。

思路:

  要暴露最少,即藏的最多,需要最小的小軍隊藏進最小的大軍隊,以此類推。

  由於不方便正向尋找最小的大軍隊,先逆序排序,找到最大的軍隊。

  讓最大的軍隊去藏他能藏的最大軍隊A(剛好滿足1/3),以A軍隊為分界線,可以分出小軍隊與大軍隊。

  再在大軍隊中一一比較滿足條件的小軍隊,記錄結果。

代碼:

//輸入部分忽略
//數組am是已從大到小排序好的部隊人數數組
//n 是部隊數
//大軍隊下標
    int res = 0//最多隱藏部隊數為n/2+n%2
    for(int i = 0; i <n/2+n%2; i++){  
//因為最多藏一半,所以從數組中間取最大 小軍隊
        if (am[res]/3 >= am[n/2+i])    
//如果符合隱藏條件,大軍隊下標即為隱藏部隊數
            res++;   
    System.out.println(n-res);            
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM