战术遮挡(烽火笔试第二题)
作者:互联网
题目描述
人的视力不能看到掩体之后的事物,在一场战争中,我们希望对方尽可能的低估我方的战斗力这样才能出其不意。
某个军事参谋效仿孙膑,把某些小规模队隐藏在大规模部队中,这样,就使得军队数量看起来变少了。已知,如果某部队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); }
标签:藏于,部队,遮挡,笔试,军队,res,人数,隐藏,烽火 来源: https://www.cnblogs.com/zccfrancis/p/14642425.html