给定三个整数a 、 b和c 。您需要从范围 [a, b] 中选择一个整数和从范围 [b, c] 中选择一个整数并将它们相加。计算获得范围 [1, b+c] 中所有数字总和的方法数的任务。
例子:
Input: a = 1, b = 2, c = 2
Output: 0, 0, 1, 1
Explanation:
The numbers to be obtained are [1, b+c] = [1, 4] = {1, 2, 3, 4}
Therefore, the number of ways to obtain each are:
1 – can’t be obtained
2 – can’t be obtained
3 – only one way. select {1} from range [a, b] and {2} from range [b, c] – 1 + 2 = 3
4 – only one way. select {2} from range [a, b] and {2} from range [b, c] – 2 + 2 = 4
Input: a = 1, b = 3, c = 4
Output: 0, 0, 0, 1, 2, 2, 1
简单的方法:
- 一个简单的蛮力解决方案是使用嵌套循环,其中外部循环从 i = a 遍历到 i = b,内部循环从 j = b 到 j = c 包括在内。
- 我们将用零初始化大小为b + c + 1 的数组 a。现在在循环中,我们将在 i+j 处增加索引,即(a[i+j]++) 。
- 我们将在最后简单地打印数组。
下面是上述方法的实现。
C++
// C++ program to calculate
// the number of ways
#include
using namespace std;
void CountWays(int a, int b, int c)
{
int x = b + c + 1;
int arr[x] = { 0 };
// Initialising the array with zeros.
// You can do using memset too.
for (int i = a; i <= b; i++) {
for (int j = b; j <= c; j++) {
arr[i + j]++;
}
}
// Printing the array
for (int i = 1; i < x; i++) {
cout << arr[i] << " ";
}
cout << endl;
}
// Driver code
int main()
{
int a = 1;
int b = 2;
int c = 2;
CountWays(a, b, c);
return 0;
}
Java
// Java program to calculate
// the number of ways
class GFG{
public static void CountWays(int a, int b,
int c)
{
int x = b + c + 1;
int[] arr = new int[x];
// Initialising the array with zeros.
// You can do using memset too.
for(int i = a; i <= b; i++)
{
for(int j = b; j <= c; j++)
{
arr[i + j]++;
}
}
// Printing the array
for(int i = 1; i < x; i++)
{
System.out.print(arr[i] + " ");
}
}
// Driver code
public static void main(String[] args)
{
int a = 1;
int b = 2;
int c = 2;
CountWays(a, b, c);
}
}
// This code is contributed by divyeshrabadiya07
Python3
# Python3 program to calculate
# the number of ways
def CountWays(a, b, c):
x = b + c + 1;
arr = [0] * x;
# Initialising the array with zeros.
# You can do using memset too.
for i in range(a, b + 1):
for j in range(b, c + 1):
arr[i + j] += 1;
# Printing the array
for i in range(1, x):
print(arr[i], end = " ");
# Driver code
if __name__ == '__main__':
a = 1;
b = 2;
c = 2;
CountWays(a, b, c);
# This code is contributed by Rajput-Ji
C#
// C# program to calculate
// the number of ways
using System;
class GFG{
public static void CountWays(int a, int b,
int c)
{
int x = b + c + 1;
int[] arr = new int[x];
// Initialising the array with zeros.
// You can do using memset too.
for(int i = a; i <= b; i++)
{
for(int j = b; j <= c; j++)
{
arr[i + j]++;
}
}
// Printing the array
for(int i = 1; i < x; i++)
{
Console.Write(arr[i] + " ");
}
}
// Driver code
public static void Main()
{
int a = 1;
int b = 2;
int c = 2;
CountWays(a, b, c);
}
}
// This code is contributed by rutvik_56
Javascript
C++
// C++ program to calculate
// the number of ways
#include
using namespace std;
void CountWays(int a, int b, int c)
{
// 2 is added because sometimes
// we will decrease the
// value out of bounds.
int x = b + c + 2;
// Initialising the array with zeros.
// You can do using memset too.
int arr[x] = { 0 };
for (int i = 1; i <= b; i++) {
arr[i + b]++;
arr[i + c + 1]--;
}
// Printing the array
for (int i = 1; i < x - 1; i++) {
arr[i] += arr[i - 1];
cout << arr[i] << " ";
}
cout << endl;
}
// Driver code
int main()
{
int a = 1;
int b = 2;
int c = 2;
CountWays(a, b, c);
return 0;
}
Java
// Java program to calculate
// the number of ways
import java.util.*;
class GFG{
static void CountWays(int a, int b, int c)
{
// 2 is added because sometimes
// we will decrease the
// value out of bounds.
int x = b + c + 2;
// Initialising the array with zeros.
int arr[] = new int[x];
for(int i = 1; i <= b; i++)
{
arr[i + b]++;
arr[i + c + 1]--;
}
// Printing the array
for(int i = 1; i < x - 1; i++)
{
arr[i] += arr[i - 1];
System.out.print(arr[i] + " ");
}
System.out.println();
}
// Driver code
public static void main(String[] args)
{
int a = 1;
int b = 2;
int c = 2;
CountWays(a, b, c);
}
}
// This code is contributed by Rohit_ranjan
Python3
# Python3 program to calculate
# the number of ways
def CountWays(a, b, c):
# 2 is added because sometimes
# we will decrease the
# value out of bounds.
x = b + c + 2;
# Initialising the array with zeros.
arr = [0] * x;
for i in range(1, b+1):
arr[i + b] = arr[i + b] + 1;
arr[i + c + 1] = arr[i + c + 1] -1;
# Printing the array
for i in range(1, x-1):
arr[i] += arr[i - 1];
print(arr[i], end = " ");
# Driver code
if __name__ == '__main__':
a = 1;
b = 2;
c = 2;
CountWays(a, b, c);
# This code is contributed by rock_cool
C#
// C# program to calculate
// the number of ways
using System;
class GFG{
static void CountWays(int a, int b, int c)
{
// 2 is added because sometimes
// we will decrease the
// value out of bounds.
int x = b + c + 2;
// Initialising the array with zeros.
int []arr = new int[x];
for(int i = 1; i <= b; i++)
{
arr[i + b]++;
arr[i + c + 1]--;
}
// Printing the array
for(int i = 1; i < x - 1; i++)
{
arr[i] += arr[i - 1];
Console.Write(arr[i] + " ");
}
Console.WriteLine();
}
// Driver code
public static void Main()
{
int a = 1;
int b = 2;
int c = 2;
CountWays(a, b, c);
}
}
// This code is contributed by Code_Mech
Javascript
0 0 1 1
时间复杂度: O((ba)*(cb)),在最坏的情况下是 O(c 2 )
高效方法:思路是使用Prefix Sum逻辑来解决这个问题。
- 我们将从 [a, b] 遍历 i,对于每个 i,我们将简单地将起始间隔 arr[i + b] 的值增加 1,并将结束间隔 arr[i + c + 1] 的值减少 1。
- 现在我们需要做的就是计算数组的前缀和( arr[i]+ = arr[i-1] )并打印数组。
让我们在示例的帮助下了解该方法。
为什么这样做?
For example: a = 1, b = 2, c = 2, we will encounter only two values of i
i = 1 = > arr[1+2]++; arr[1+2+1]–;
i = 2 = > arr[2+2]++; arr[2+2+1]–;
arr = {0, 0, 0, 1, 0, -1};
prefix sums:
arr = {0, 0, 0, 1, 1, 0};
Now carefully look and realise that this is our answer.
So what we do at particular index i is arr[i+b]++ and arr[i+c+1]–;
Now we are using prefix sums so all the values will be incremented by 1 between i+b and infinite(We won’t go there but will result in prefix sum increment by 1 and as soon as we do a decrement at i+c+1 all the values between i+c+1 and infinite will be decreased by one.
So effectively all the values in the range [i+b, i+c] are incremented by one, and rest all the values will remain unaffected.
下面是上述方法的实现。
C++
// C++ program to calculate
// the number of ways
#include
using namespace std;
void CountWays(int a, int b, int c)
{
// 2 is added because sometimes
// we will decrease the
// value out of bounds.
int x = b + c + 2;
// Initialising the array with zeros.
// You can do using memset too.
int arr[x] = { 0 };
for (int i = 1; i <= b; i++) {
arr[i + b]++;
arr[i + c + 1]--;
}
// Printing the array
for (int i = 1; i < x - 1; i++) {
arr[i] += arr[i - 1];
cout << arr[i] << " ";
}
cout << endl;
}
// Driver code
int main()
{
int a = 1;
int b = 2;
int c = 2;
CountWays(a, b, c);
return 0;
}
Java
// Java program to calculate
// the number of ways
import java.util.*;
class GFG{
static void CountWays(int a, int b, int c)
{
// 2 is added because sometimes
// we will decrease the
// value out of bounds.
int x = b + c + 2;
// Initialising the array with zeros.
int arr[] = new int[x];
for(int i = 1; i <= b; i++)
{
arr[i + b]++;
arr[i + c + 1]--;
}
// Printing the array
for(int i = 1; i < x - 1; i++)
{
arr[i] += arr[i - 1];
System.out.print(arr[i] + " ");
}
System.out.println();
}
// Driver code
public static void main(String[] args)
{
int a = 1;
int b = 2;
int c = 2;
CountWays(a, b, c);
}
}
// This code is contributed by Rohit_ranjan
蟒蛇3
# Python3 program to calculate
# the number of ways
def CountWays(a, b, c):
# 2 is added because sometimes
# we will decrease the
# value out of bounds.
x = b + c + 2;
# Initialising the array with zeros.
arr = [0] * x;
for i in range(1, b+1):
arr[i + b] = arr[i + b] + 1;
arr[i + c + 1] = arr[i + c + 1] -1;
# Printing the array
for i in range(1, x-1):
arr[i] += arr[i - 1];
print(arr[i], end = " ");
# Driver code
if __name__ == '__main__':
a = 1;
b = 2;
c = 2;
CountWays(a, b, c);
# This code is contributed by rock_cool
C#
// C# program to calculate
// the number of ways
using System;
class GFG{
static void CountWays(int a, int b, int c)
{
// 2 is added because sometimes
// we will decrease the
// value out of bounds.
int x = b + c + 2;
// Initialising the array with zeros.
int []arr = new int[x];
for(int i = 1; i <= b; i++)
{
arr[i + b]++;
arr[i + c + 1]--;
}
// Printing the array
for(int i = 1; i < x - 1; i++)
{
arr[i] += arr[i - 1];
Console.Write(arr[i] + " ");
}
Console.WriteLine();
}
// Driver code
public static void Main()
{
int a = 1;
int b = 2;
int c = 2;
CountWays(a, b, c);
}
}
// This code is contributed by Code_Mech
Javascript
0 0 1 1
时间复杂度: O(C)
如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live