对所有的数字升序排序
对于第i个数是冠军,他要赢k场
其中,1~i-1是必赢的
i~j是与他相同大小的,也是必赢的
这时就赢了j-1场了(下标到j,不赢自己)
冠军总共需要下场k场,则还剩
need=k-(j-1)=k-j+1场需要赢
对于两种道具,最多用在两个人身上,赢两场
所以仅当need<=2时有解,need>2时无解
考虑need<=0的情况,则此时必赢。
剩下两种情况,need=1和need=2
先考虑need=2的情况,则i一定要进行两场战斗
除二道具比乘二道具效果更强(a[n]是奇数时获胜条件可以更小)
所以对a[n]使用除二道具得到x=a[n]/2
若a[i]>=x,则证明可以赢n
然后还需要赢一场,我们知道n是一定可以赢所有人的
为了保险起见,我们挑最弱的一个a[i+1]
使用乘二道具,a[i]*2>=a[i+1] 则胜利
此时两个条件都满足,证明i可以再赢两场,战胜n成为冠军
否则i就不可以成为冠军
考虑need=1的情况,i只用战斗一场就可以了
最粗鲁的办法是,对i使用乘二,对n使用除二
直接判断 a[i]*2>=a[n]/2, 这样就错了
比如3 7 14这一组样例
我们可以对7使用x2道具让他战胜14
再对7使用/2道具被3战胜
这样3是可以成为冠军的
但是如果直接判断,3*2=6 < 14/2=7
正确做法是,考虑对一个中间数x
x=a[n]/2;
y=a[i]*2;
如果a[n]是偶数,则y还可以增大1
要满足
(1)y大于等于x
(2)y在数组里出现
用二分查找到y的位置
p=lower_bound(a,a+n,y)-a;
直接判断
(1)a[p]*2>=a[n]&&a[i]>=a[p]/2
(2)a[p]>=a[n]/2&&a[i]*2>=a[p]
其中之一成立都可以
否则i不可以成为冠军