endless 题解

本文详细解析了Endless问题的解决方案,采用贪心、二分查找与排序策略,阐述了魔法最大路程的计算方法,通过递推式简化问题,并提出两种解题思路:85分方法和满分方法,深入探讨了算法效率与实现技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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={fi1+ail1ini=0
那么我们可以用O(n)O(n)O(n)求出fff数组。

  • 858585分的方法:每一次只要循环找到一个比ttt大的数,输出它并停止循环,就行了。时间复杂度为O(nq)O(nq)O(nq)
  • 满分的方法:我们发现fff数组有单调性,所以只要二分答案就行了。时间复杂度为O(qlog⁡2n)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!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值