【发布时间】:2020-06-29 20:59:12
【问题描述】:
我正在对我的函数myFunc()的以下问题进行压力测试。
有一座石桥连接两个城市。从一个城市开始的第一块石头上刻有1,最后一块石头在另一个城市的一侧。每个后续的石头上都有两个连续的数字,除了最后一个石头上可能有一个或两个数字,这取决于 N 的值。 石头可以排列为 1, (2, 3), (4, 5), (6, 7)...N。
给你一个数字N,代表最后一块石头上的最后一个数字;和数字 X。任务是找到从第一个城市一侧或第二个城市一侧到达刻有 X 的石头所需的最少跳跃次数。 注意:跳第一块石头算0跳。
示例: 输入: 2 10 3 5 1
输出: 1 0
说明: 测试用例 1:N = 10 的石头对齐方式如下: 1, (2, 3), (4, 5), (6, 7), (8, 9), 10 要在 X = 3 上跳跃,您只需要从第一个城市一侧跳一次(因为第一次跳石不计算在内),然后从第二个城市跳 4 次。所以 1 和 4 的最小值是 1。
测试用例 2:N = 5 的石头排列如下: 1, (2, 3), (4, 5) 要在 X = 1 上跳跃,您只需要从第一个城市一侧跳零次(因为第一次跳石不计算在内),从第二个城市一侧跳跃 2 次。所以 0 和 2 的最小值是 0。
#include <iostream>
#include <algorithm>
#include <ctime>
using namespace std;
int myFunc(int n, int p) {
return p / 2;
}
int findJumps(int n, int p){
return min(X /2, (N / 2) - (X / 2));
}
int main() {
int n, x;
srand(time(0));
while(true) {
n = rand() % 40 + 1; // I want n to be always greater than x
x = rand() % 40 + 1;
if(myFunc(n, x) != findJumps(n, x)) {
cout << n << " " << x;
break;
}
else cout << n << " " << x;
cout << endl;
}
return 0;
}
我想要我的代码是在无限循环范围内生成 N 总是大于 X。我该如何强制执行此条件?
【问题讨论】:
-
9 和 40 是从哪里来的?您总是可以先生成 x,然后生成 n 作为 x+1 到 40 之间的随机数,或者如果您不关心严格的上限,只需在生成时将 x 添加到 n。
-
你为什么要在每个循环中调用 srand?一旦在循环之外会更好。
-
@Rup,对不起,我的错
-
一个愚蠢但有效的解决方案:
while(n <= x) x = rand() % 40 + 1;。 (如果n设置为可能的最小值,请注意无限循环的可能性) -
有什么理由不能创建两个随机数并在它们的顺序错误时交换它们?