微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?