战术遮挡

题目描述
  人的视力不能看到掩体之后的事物,在一场战争中,我们希望对方尽可能的低估我方的战斗力这样才能出其不意。

  某个军事参谋效仿孙膑,把某些小规模队隐藏在大规模部队中,这样,就使得军队数量看起来变少了。已知,如果某部队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);            
    }

 

posted @ 2021-04-10 22:34  zjcfrancis  阅读(396)  评论(0编辑  收藏  举报