endless 题解

endlessendless 题解

题目

endless 题解
endless 题解
endless 题解

解题方法

这道题考点是贪心、二分查找和排序。
首先我们设fif_i表示用ii个魔法的最大路程,则我们贪心,每次选最大的那ii个魔法最优,因此
fi=l+j=1iajf_i=l+\sum_{j=1}^{i}{a_j}
注意,我们要把aa数组先排序再求解。
继续简化上式,可得递推式
fi={fi1+ai1inli=0f_i=\begin{cases} f_{i-1}+a_i&1\leq i\leq n\\ l&i=0 \end{cases}
那么我们可以用O(n)O(n)求出ff数组。

  • 8585分的方法:每一次只要循环找到一个比tt大的数,输出它并停止循环,就行了。时间复杂度为O(nq)O(nq)
  • 满分的方法:我们发现ff数组有单调性,所以只要二分答案就行了。时间复杂度为O(qlog2n)O(q\log_2^n)

注意,我们不用除法,直接乘过去就行了。
因为ss(路程)除以tt(时间)等于vv(速度)。
也就是v=stv=\frac{s}{t},可得s=vts=vt
而现在我们要求st>v\frac{s}{t}>v,也就是s>vts>vt
这样就不用算除法了。
注意,一定要开longlonglong\:long!!!