给定砖块总数T,找到可以通过使用给定砖块形成的阶梯数,这样,如果步骤S具有砖块B,则步骤S + 1应该恰好具有B + 1砖块,并且所使用的砖块总数应小于或等于可用砖的数量。
注意:进行楼梯的第1步所需的砖数为2,即,步骤S = 1必须正好具有B = 2砖。
例子:
Input : 15
Output : 4
Bricks should be arranged in this pattern to solve for T = 15:
Explanation:
Number of bricks at step increases by one.
At Step 1, Number of bricks = 2, Total = 2
At step 2, Number of bricks = 3, Total = 5
At step 3, Number of bricks = 4, Total = 9
At step 4, Number of bricks = 5, Total = 14
If we add 6 more bricks to form new step,
then the total number of bricks available will surpass.
Hence, number of steps that can be formed are 4 and
number of bricks used are 14 and we are left with
1 brick which is useless.
Input : 40
Output : 7
Bricks should be arranged in this pattern to solve for T = 40:
Explanation:
At Step 1, Number of bricks = 2, Total = 2
At step 2, Number of bricks = 3, Total = 5
At step 3, Number of bricks = 4, Total = 9
At step 4, Number of bricks = 5, Total = 14
At step 5, Number of bricks = 6, Total = 20
At step 6, Number of bricks = 7, Total = 27
At step 7, Number of bricks = 8, Total = 35
If we add 9 more bricks to form new step,
then the total number of bricks available will surpass.
Hence, number of steps that can be formed are 7 and
number of bricks used are 35 and we are left with
5 bricks which are useless.
方法:
我们对步骤的数量感兴趣,并且我们知道Si的每个步骤都使用Bi砖的数量。我们可以用一个等式表示这个问题:
n *(n +1)/ 2 = T(对于从1、2、3、4、5…开始的自然数列)
n *(n + 1)= 2 * T
n-1将代表我们的最终解决方案,因为我们的问题序列从2、3、4、5…开始
现在,我们只需要求解该方程式,就可以利用二进制搜索找到该方程式的解。二进制搜索的下限和上限分别为1和T。
下面是上述方法的实现:
C++
// C++ program to find the number of steps
#include
using namespace std;
// Modified Binary search function
// to solve the equation
int solve(int low, int high, int T)
{
while (low <= high) {
int mid = (low + high) / 2;
// if mid is solution to equation
if ((mid * (mid + 1)) == T)
return mid;
// if our solution to equation
// lies between mid and mid-1
if (mid > 0 && (mid * (mid + 1)) > T &&
(mid * (mid - 1)) <= T)
return mid - 1;
// if solution to equation is
// greater than mid
if ((mid * (mid + 1)) > T)
high = mid - 1;
// if solution to equation is less
// than mid
else
low = mid + 1;
}
return -1;
}
// driver function
int main()
{
int T = 15;
// call binary search method to
// solve for limits 1 to T
int ans = solve(1, T, 2 * T);
// Because our pattern starts from 2, 3, 4, 5...
// so, we subtract 1 from ans
if (ans != -1)
ans--;
cout << "Number of stair steps = "
<< ans << endl;
return 0;
}
Java
// Java program to find the number of steps
import java.util.*;
import java.lang.*;
public class GfG {
// Modified Binary search function
// to solve the equation
public static int solve(int low, int high, int T)
{
while (low <= high) {
int mid = (low + high) / 2;
// if mid is solution to equation
if ((mid * (mid + 1)) == T)
return mid;
// if our solution to equation
// lies between mid and mid-1
if (mid > 0 && (mid * (mid + 1)) > T &&
(mid * (mid - 1)) <= T)
return mid - 1;
// if solution to equation is
// greater than mid
if ((mid * (mid + 1)) > T)
high = mid - 1;
// if solution to equation is less
// than mid
else
low = mid + 1;
}
return -1;
}
// driver function
public static void main(String argc[])
{
int T = 15;
// call binary search method to
// solve for limits 1 to T
int ans = solve(1, T, 2 * T);
// Because our pattern starts from 2, 3, 4, 5...
// so, we subtract 1 from ans
if (ans != -1)
ans--;
System.out.println("Number of stair steps = " + ans);
}
}
/* This code is Contributed by Sagar Shukla */
Python3
# Python3 code to find the number of steps
# Modified Binary search function
# to solve the equation
def solve( low, high, T ):
while low <= high:
mid = int((low + high) / 2)
# if mid is solution to equation
if (mid * (mid + 1)) == T:
return mid
# if our solution to equation
# lies between mid and mid-1
if (mid > 0 and (mid * (mid + 1)) > T
and (mid * (mid - 1)) <= T) :
return mid - 1
# if solution to equation is
# greater than mid
if (mid * (mid + 1)) > T:
high = mid - 1;
# if solution to equation is
# less than mid
else:
low = mid + 1
return -1
# driver code
T = 15
# call binary search method to
# solve for limits 1 to T
ans = solve(1, T, 2 * T)
# Because our pattern starts from 2, 3, 4, 5...
# so, we subtract 1 from ans
if ans != -1:
ans-= 1
print("Number of stair steps = ", ans)
# This code is contributed by "Sharad_Bhardwaj".
C#
// C# program to find the number of steps
using System;
public class GfG {
// Modified Binary search function
// to solve the equation
public static int solve(int low, int high, int T)
{
while (low <= high) {
int mid = (low + high) / 2;
// if mid is solution to equation
if ((mid * (mid + 1)) == T)
return mid;
// if our solution to equation
// lies between mid and mid-1
if (mid > 0 && (mid * (mid + 1)) > T &&
(mid * (mid - 1)) <= T)
return mid - 1;
// if solution to equation is
// greater than mid
if ((mid * (mid + 1)) > T)
high = mid - 1;
// if solution to equation is less
// than mid
else
low = mid + 1;
}
return -1;
}
// Driver function
public static void Main()
{
int T = 15;
// call binary search method to
// solve for limits 1 to T
int ans = solve(1, T, 2 * T);
// Because our pattern starts
//from 2, 3, 4, 5...
// so, we subtract 1 from ans
if (ans != -1)
ans--;
Console.WriteLine("Number of stair steps = " + ans);
}
}
/* This code is Contributed by vt_m */
PHP
0 && ($mid * ($mid + 1)) > $T &&
($mid * ($mid - 1)) <= $T )
return $mid - 1;
// if solution to equation is
// greater than mid
if (($mid * ($mid + 1)) > $T)
$high = $mid - 1;
// if solution to
// equation is less
// than mid
else
$low = $mid + 1;
}
return -1;
}
// Driver Code
$T = 15;
// call binary search
// method to solve
// for limits 1 to T
$ans = solve(1, $T, 2 * $T);
// Because our pattern
// starts from 2, 3, 4, 5...
// so, we subtract 1 from ans
if ($ans != -1)
$ans--;
echo "Number of stair steps = ", $ans, "\n";
// This code is contributed by aj_36
?>
Javascript
输出:
Number of stair steps = 4