题目描述
人的视力不能看到掩体之后的事物,在一场战争中,我们希望对方尽可能的低估我方的战斗力这样才能出其不意。
某个军事参谋效仿孙膑,把某些小规模队隐藏在大规模部队中,这样,就使得军队数量看起来变少了。已知,如果某部队A的人数小于等于另一支部队B人数的1/3, 则可以将A藏于B中,且不被人发现。不支持嵌套,例如A小于B的三分之一,可将A藏于B, 如果又存在B是C的三分之一,不可再将B藏于C。
现在已知我方共有n支部队,且知道每支部队的人数,请问,在最优方案下,我们暴露给敌人的部队数量有几支。
输入描述
输入第一行包含一个正整数n,表示我方有n支部队(1<=n<=50000)
第二行有n个整数,表示每支部队的人数,中间用空格隔开。(1<=a_ i<=10^8)
输出描述
输出仅包含一个整数, 表示最少的游戏局数。
示例输入
5
2 6 7 7 10
示例输出
4
解题思路
我们应让尽可能小的小军队隐藏到尽可能小的大军队中(刚刚能够隐藏就好,不要超出太多,大的军队用于隐藏更大的军队)
为此,我们可以这么做:
- 先将军队数目排序,然后找到最大军队能够隐藏小军队里最大的军队(
1/3
关系),依此将军队分为大军队和小军队两个队 - 然后将小军队隐藏在大军队中,尽量隐藏在较小的大军队中,以达到隐藏更多军队的目的,隐藏过的军队不再考虑
代码实现
def handle(n,array):
arr=array
arr=sorted(arr)
index=-1
for i in range(arr.__len__()):
if arr[i]<=arr[-1]/3:
index=i
if index==-1:return arr.__len__()
A=arr[:index+1]
B=arr[index+1:]
res=0
t=0
for i in range(A.__len__()):
for j in range(t,B.__len__()):
t+=1
if A[i]<=B[j]/3:
res+=1
A[i]=1000000000
B[j]=0
break
return arr.__len__()-res
n=int(input())
arr=[]
st=input().split(' ')
for i in range(n):
arr.append(int(st[i]))
print(handle(n,arr))
运行结果:
输入:
5
2 6 7 7 10
输出:
4