一.转化成n条直线
不难看出,每个人所花费的时间是(t=frac S {s_i} +frac R {r_i})
不妨设R=1,则(t=frac {frac S R} {s_i} +frac 1 {r_i})
现在准备一个点((frac 1 {s_i},frac 1 {r_i}))
则(t=frac {frac S R} {s_i} +frac 1 {r_i})
令(k=-frac S R,x=frac 1 {s_i},y=frac 1 {r_i}) ((k<0))
∴ (t=-kx+y)
∴ (y=kx+t)
也就是说,我们拥有了n条直线。
二.答案在左下凸包上
对于每条直线,需要寻找使得t最小的k。
对于一个点A,它的左下方如果有一个点B时,
(y_A=kx_A+t_A,y_B=kx_B+t_B)
(t_A=-kx_A+y_A,t_B=-kx_B+y_B)
∵(x_Ble x_A,y_Ble y_A)
∴(t_B le t_A)
因此答案在左下凸包上。
三.关于左下凸包
可以先排除x和y都比其他的点中某一个小的。
先按照x从小到大排序,x一样按照y从小到大排序。
求左下凸包的时候,每两个凸包上的点k<0并且k逐渐减小。
四.警告
1.宇智波—鼬 的代码,为了不损失精度,x的存储是(s_i),y的存储是(r_i),不要看着四就搞错了。
2.要去重。