題目描述
人的視力不能看到掩體之后的事物,在一場戰爭中,我們希望對方盡可能的低估我方的戰斗力這樣才能出其不意。
某個軍事參謀效仿孫臏,把某些小規模隊隱藏在大規模部隊中,這樣,就使得軍隊數量看起來變少了。已知,如果某部隊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); }