F是一个函数,数字x以升序f(x)重复。
x:1 2 3 4 5 6 7 8 9 10
f(x):1 2 2 3 3 3 4 4 4 4
我的函数获取'x'并给出'f(x)'并且它必须在没有数组的情况下执行它,但它在大数字中出错。
int main()
{
int n;
cin>>n;
int i=1,a=1;
if(n==1)
cout<<'1';
else{
while(true){
a++;
i=i+a;
if(i>=n)
break;
}
}
cout<<a;
return 0;
}
答案 0 :(得分:3)
<强> TL; DR 强>
f(x) = floor(0.5 + sqrt(1 + 8 * (x - 1)) / 2)
<强>解释强>
好吧,因为这是一个数学问题,只需用数学解决;)
需要注意的一点是表与triangular numbers:
之间的关联h(x) = sum(range(1, x)) = x*(x + 1)/2 //triangular number
x 1 2 3 4 5 6 7 8 9 10
f(x) 1 2 2 3 3 3 4 4 4 4
h(f(x)) 1 3 3 6 6 6 10 10 10 10
那么这对我们有什么帮助?好吧,我们可以写一个新的等式:
h(f(x)) = x | x = max({n | f(n) = f(x)})
从逻辑上讲,以下内容适用:
h^-1(x) = f(x)
不,我们有两个选择:
称它为一天,然后通过蛮力解决其余问题:
i = 1
sum = 0
while sum < x:
sum += i
i++
return i - 1
或构建我们的函数h^-1(x)
:
h(x) = y = (x+1)x/2
h^-1(y) = x with h(x) = y
x ^ 2 + x - 2y = 0
使用quadratic formula求解x:
x = 0.5 +/- sqrt(1 + 8y) / 2
现在这个公式仍然缺少一些东西:
+/-
会变成+
y
减1即可获得正确的结果y = 3 -> x = 3
,但它返回其他输入的浮点数,因此我们必须适当地向下舍入把它放在一起:
f(x) = floor(0.5 + sqrt(1 + 8 * (x - 1)) / 2)
答案 1 :(得分:1)
int f(int x) {
return (x * (x + 1)) / 2;
}
int main() {
int n;
cin >> n;
int left = 1, right = n;
while(left < right) {
int mid = left + (right - left) / 2;
int val = f(mid);
if(val >= n) {
right = mid;
}
else {
left = mid + 1;
}
}
cout << left;
return 0;
}
使用二进制搜索。现在我在移动。如果需要,我稍后会添加解释。如果你不了解任何事情,请告诉我。