题目分析:
我们对于国王身后的两个点来分析
队列可能是这样的:
* | Left | Right |
---|---|---|
king: | a0 a 0 | b0 b 0 |
p1 | a1 a 1 | b1 b 1 |
p2 | a2 a 2 | b2 b 2 |
那么我们计算可得 ans1 a n s 1 = max(a0b1,a0∗a1b2) m a x ( a 0 b 1 , a 0 ∗ a 1 b 2 )
队列也有可能是这样的
* | Left | Right |
---|---|---|
king: | a0 a 0 | b0 b 0 |
p2 | a2 a 2 | b2 b 2 |
p1 | a1 a 1 | b1 b 1 |
那么我们计算可得 ans2 a n s 2 = max(a0b2,a0∗a2b1) m a x ( a 0 b 2 , a 0 ∗ a 2 b 1 )
我们来对比一下两个答案:
ans1 a n s 1 = max(a0b1,a0∗a1b2) m a x ( a 0 b 1 , a 0 ∗ a 1 b 2 )
ans2 a n s 2 = max(a0b2,a0∗a2b1) m a x ( a 0 b 2 , a 0 ∗ a 2 b 1 )
可以替换得:
ans1 a n s 1 = max(k1,k2) m a x ( k 1 , k 2 )
ans2 a n s 2 = max(k3,k4) m a x ( k 3 , k 4 )
显然我们可以得到:
a0∗a1b2 a 0 ∗ a 1 b 2 > a0b2 a 0 b 2
a0∗a2b1 a 0 ∗ a 2 b 1 > a0b1 a 0 b 1
即:
k2
k
2
>
k3
k
3
k4 k 4 > k1 k 1
如果 ans1 a n s 1 < ans2 a n s 2
那么易得:
k4>k2 k 4 > k 2
即:
a0∗a2b1
a
0
∗
a
2
b
1
>
a0∗a1b2
a
0
∗
a
1
b
2
变形可得:
a1∗b1<a2∗b2 a 1 ∗ b 1 < a 2 ∗ b 2
当 a1∗b1<a2∗b2 a 1 ∗ b 1 < a 2 ∗ b 2 时,我们也能够得到 ans1 a n s 1 < ans2 a n s 2 的结论
所以,为了 ans a n s 取到最小值,我们需要将 ai∗bi a i ∗ b i 较小的放在前面
那么我们以 ai∗bi a i ∗ b i 为关键字排序即可
同时,统计答案时一定不要忘了写高精度!
更新!
最近有一位dalao私信了我@Zory,提出了他的问题
Q:对于一个方案,a和b的调换,可能会影响到中间的数结果,怎么办?
A:让我们再来看一看
已知在国王后面的两个点 a∗b a ∗ b 较小的应该放在前面,那么将国王左手的 a0 a 0 看做一段序列的乘积 A A ,则又变成了这样的形式: