endlessendlessendless 题解
题目
解题方法
这道题考点是贪心、二分查找和排序。
首先我们设fif_ifi表示用iii个魔法的最大路程,则我们贪心,每次选最大的那iii个魔法最优,因此
fi=l+∑j=1iajf_i=l+\sum_{j=1}^{i}{a_j}fi=l+∑j=1iaj
注意,我们要把aaa数组先排序再求解。
继续简化上式,可得递推式
fi={fi−1+ai1≤i≤nli=0f_i=\begin{cases}
f_{i-1}+a_i&1\leq i\leq n\\
l&i=0
\end{cases}fi={fi−1+ail1≤i≤ni=0
那么我们可以用O(n)O(n)O(n)求出fff数组。
- 858585分的方法:每一次只要循环找到一个比ttt大的数,输出它并停止循环,就行了。时间复杂度为O(nq)O(nq)O(nq)。
- 满分的方法:我们发现fff数组有单调性,所以只要二分答案就行了。时间复杂度为O(qlog2n)O(q\log_2^n)O(qlog2n)。
注意,我们不用除法,直接乘过去就行了。
因为sss(路程)除以ttt(时间)等于vvv(速度)。
也就是v=stv=\frac{s}{t}v=ts,可得s=vts=vts=vt。
而现在我们要求st>v\frac{s}{t}>vts>v,也就是s>vts>vts>vt。
这样就不用算除法了。
注意,一定要开long longlong\:longlonglong!!!