河内塔-Long Int无法处理结果-在C ++上使用时间戳

时间:2018-10-15 13:55:52

标签: c++ timestamp

我正在尝试解决Urionlinejudge.com上的挑战,问题(请参见下文)要求计算解决河内塔问题所需的时间并输出小时(以HH:MM:SS格式)它结束了。

输入是磁盘数,输出是解决问题的小时数(认为每一步需要一秒钟)。

我知道此算法在(2 ^ n)-1中增长。

主要问题是,如果输入很大,则“ long int”将无法处理结果,因为它呈指数增长。

我尝试使用“ for”解决此问题,并在24小时后减去该数字,因为问题并不要求花费多少天,而仅询问问题结束当天的小时。 >

但是,我超出了最大运行时间。我该怎么办?

#include <iostream>
#include <math.h>
#include <iomanip>
using namespace std;

int main()
{
    int n = 0;
    cin >> n;
    if (n < 17)
    {
        n = pow(2, n);
        n--;
    }
    else
    {
        int j = 1;
        for (int i = 0; i < n; i++)
        {
            j *= 2;
            if (j >= 86400)
            {
                j -= 86400;
            }
        }
        n = j - 1;
    }
    int second, minute, hour;
    if (n >= 86400)
    {
        n = n % 86400;
    }
    if (n >= 3600)
    {
        hour = n / 3600;
        minute = n % 3600;
        if (minute >= 60)
        {
            second = minute % 60;
            minute = minute / 60;
        }
        else
        {
            minute = 0;
            second = n;
        }
    }
    else if (n >= 60)
    {
        hour = 0;
        minute = n / 60;
        second = n % 60;
    }
    else
    {
        hour = 0;
        minute = 0;
        second = n;
    }

    cout << setw(2) << setfill('0') << hour << ":" << setw(2) << setfill('0')
            << minute << ":" << setw(2) << setfill('0') << second << endl;
    return 0;
}

问题:

(...) 问题由3个销钉组成,并且在第一个销钉中放着一堆磁盘,一个磁盘比另一个磁盘大。众所周知,不允许将较大的磁盘放在较小的磁盘上方。这意味着,要从堆中移出一个磁盘,必须首先移除所有较小的磁盘。除此之外,只允许一次移动一个磁盘。

将第一个针脚的所有磁盘都转移到第三个针脚后,问题就解决了。

我们知道猴子在午夜(00:00:00)开始工作,并且每天不间断工作24小时,并且它们至少需要1秒才能移动每个磁盘。您的任务是以hh:mm:ss格式预测白天或晚上的确切时间,这是猴子最早可能完成游戏并结束世界的时间。

输入 输入由一行包含单个整数0 40 组成,这是起始堆栈中的磁盘数。

输出 输出由格式为A:B:C的字符串组成,其中0≤A <24 e 0≤B,C <60(HH:MM:SS)格式。

来源:https://www.urionlinejudge.com.br/judge/en/problems/view/2681

0 个答案:

没有答案