我试图解决黑客排名超过here的问题。
问题是:
所以为了解决这个问题,我尝试了一个简单的数学方程式:
4x + 7y = lucky_number
例如,要检查15
是否为lucky_number
,我可以从x
,y
值0
开始,并在上面替换等式直到等于或大于(如果是这样停止并说它不是幸运数字)
以上逻辑运行正常。但问题是数字很大,想象一下,从966888032206353
开始x,y
开始0
是不是一个有效的想法。
对它的任何指导?
答案 0 :(得分:1)
另一种思考方式:您需要做的就是绘制线
7y = -4x + 966888032206353
并识别x和y都是整数的任何点。
所以,你不需要嵌套循环。代替:
将y迭代为整数。 for y=0; y<966888032206353 / 7; y++
对于每次迭代,使用浮点数学求解x。
如果x是整数,则数字很幸运。
这将需要大约138T的迭代次数。
答案 1 :(得分:1)
从7 * 4 = 28起的所有数字(实际上甚至是18岁以上的所有数字)都很幸运,其余的只是预先计算一个小桌子。
答案 2 :(得分:1)
这是我提交给Hackerrank的代码。
#include <bits/stdc++.h>
using namespace std;
int q; long long n; bool dp[1009];
int main() {
cin >> q;
dp[0] = true;
for(int i = 1; i <= 1000; i++) {
if(i >= 4 && dp[i - 4]) dp[i] = true;
if(i >= 7 && dp[i - 7]) dp[i] = true;
}
while(q--) {
cin >> n;
if(n >= 1000 || dp[n]) cout << "Yes" << endl;
else cout << "No" << endl;
}
}
这是动态编程,但如果n >= 28
它总是正常的。
答案 3 :(得分:0)
您的一个问题是您的问题描述非常不完整。如果您只允许负4x + 7y
和x
,则可以将任意整数表示为y
。例如,1 = 4*2 + (-1)*7
您可以通过乘以该因子获得任何数字的解决方案。
我认为从算法角度来看,最好的解决方案是使用动态编程。您可以简单地开始检查数字是否在您意义上是幸运的。一旦你找到4个连续的幸运数字,你就可以停下来,因为之后的任何数字都会很幸运,只需加上4个适当的次数即可。我猜你很早就会发现一系列4个连续的幸运数字。