我正在尝试解决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
输出 输出由格式为A:B:C的字符串组成,其中0≤A <24 e 0≤B,C <60(HH:MM:SS)格式。
来源:https://www.urionlinejudge.com.br/judge/en/problems/view/2681