如何优化这个问题的代码?

问题描述

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;
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...