endless 题解

13 篇文章 0 订阅
4 篇文章 0 订阅

e n d l e s s endless endless 题解

题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解题方法

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值