如何解决如何优化这个问题的代码?
Darkishland 市有一家奇怪的旅馆,房间数不胜数。来这家酒店的团体遵循以下规则:
同时只有一组成员可以租用酒店。 每个团体都在入住当天的早上抵达,并在退房当天的晚上离开酒店。 在前一组离开酒店后的第二天早上,另一组来了。
传入组的一个非常重要的属性是它比之前的组多一个成员,除非它是起始组。您将获得起始组的成员数量。
一个有 n
名成员的团体在酒店住了 n
天。比如8月1日早上4人一组,8月4日晚上离开酒店,下一组5人8月5日早上来,入住5天,以此类推。
给定初始团体人数,您必须找到指定日期入住酒店的团体人数。
输入
S
表示团体的初始人数,D
表示您必须找到第 D-th
天(从 1 开始)入住酒店的团体人数。团体人数 S
表示在第一天,一组 S
成员来到酒店并停留 S
天。然后是一组 S + 1
成员,根据之前描述的规则等等。
我是通过以下方式做的这个问题
long long groupSize(long long S,long long D) {
for(; (D-S) > 0; S++) {
D = D - S;
}
return S;
}
但问题说我应该优化它。
我怎样才能使我的答案最佳?
解决方法
for(S; (D-S)> 0;S++){
D= D-S;
}
运行循环不是最优的;相反,您可以通过固定数量的操作直接计算答案。
如果这是针对离散数学课程的问题,那么技巧应该是您正在学习的内容。 D_next = D - S
是递归关系。
你不断增加 S,所以你减去 1,然后是 2,然后是 3,等等。有一个简单的公式来计算 1..n 的总和。当总和等于(原始)D 时,求解 n。
,如果 for 循环进行 n 步,则意味着: D > S + (S+1) + ... + (S+n-1)
您可以通过分析解决此问题并对潜在的数值误差进行修正。
long long groupSize(long long S,long long D)
{
long long twoSMinus1 = 2 * S - 1;
// solution of quadratic equation
long long result1 = 0.5 * (sqrt(8 * D + twoSMinus1 * twoSMinus1) - twoSMinus1);
long long result2 = result1 - 1;
// You have to make sure that numerical error did not mess up the result
if (result1 * (result1- 1) / 2 + result1 * S < D)
{
return result1 + S;
}
return result2 + S;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。