将数组分解为最大数量的子数组,使它们的平均值相同
给定一个整数数组,任务是将数组划分为最大数量的子数组,使得所有子数组的平均值相同。如果无法分割,则打印“Not possible”。
例子:
Input : arr[] = {1, 5, 7, 2, 0};
Output : (0 1)
(2 4)
Subarrays arr[0..1] and arr[2..4]
have same average.
Input : arr[] = {4, 6, 2, 4, 8, 0, 6, 2};
Output : (0, 0)
(1, 2)
(3, 3)
(4, 5)
(6, 7)
Input : arr[] = {3, 3, 3};
Output : (0, 0)
(1, 1)
(2, 2)
Input : arr[] = {4, 3, 5, 9, 11};
Output : Not possible
这个想法是基于这样一个事实,如果一个数组可以被划分为具有相同平均值的子数组,那么所有这些子数组的平均值必须与整体平均值相同。
1) 求整个数组的平均值。
2)再次遍历数组并跟踪当前子数组的平均值。一旦平均值与整体平均值相同,打印当前子数组并开始一个新的子数组。
该解决方案分为最大数量的子阵列,因为一旦我们发现平均值与整体平均值相同,我们就会开始一个新的子阵列。
C++
// C++ program to break given array into maximum
// number of subarrays with equal average.
#include
using namespace std;
void findSubarrays(int arr[], int n)
{
// To store all points where we can break
// given array into equal average subarrays.
vector result;
// Compute total array sum
int sum = 0;
for (int i = 0; i < n; i++)
sum += arr[i];
int curr_sum = 0; // Current Sum
int prev_index = -1; // Index of previous subarray
for (int i = 0; i < n ; i++)
{
curr_sum += arr[i];
// If current point is a break point. Note that
// we don't compare actual averages to avoid
// floating point errors.
if (sum * (i - prev_index) == curr_sum * n)
{
// Update current sum and previous index
curr_sum = 0;
prev_index = i;
// Add current break point
result.push_back(i);
}
}
// If last break point was not end of array, we
// cannot break the whole array.
if (prev_index != n-1)
{
cout << "Not Possible";
return;
}
// Printing the result in required format
cout << "(0, " << result[0] << ")\n";
for (int i=1; i
Java
// Java program to break given array into maximum
// number of subarrays with equal average.
import java.util.Vector;
class GFG {
static void findSubarrays(int arr[], int n)
{
// To store all points where we can break
// given array into equal average subarrays.
Vector result = new Vector<>();
// Compute total array sum
int sum = 0;
for (int i = 0; i < n; i++)
sum += arr[i];
int curr_sum = 0; // Current Sum
int prev_index = -1; // Index of previous subarray
for (int i = 0; i < n ; i++)
{
curr_sum += arr[i];
// If current point is a break point. Note that
// we don't compare actual averages to avoid
// floating point errors.
if (sum *(i - prev_index) == curr_sum*n)
{
// Update current sum and previous index
curr_sum = 0;
prev_index = i;
// Add current break point
result.add(i);
}
}
// If last break point was not end of array, we
// cannot break the whole array.
if (prev_index != n-1)
{
System.out.println("Not Possible");
return;
}
// Printing the result in required format
System.out.print("(0, " + result.get(0) + ")\n");
for (int i=1; i
Python3
# Python 3 program to break given array
# into maximum number of subarrays with
# equal average.
def findSubarrays(arr, n):
# To store all points where we can break
# given array into equal average subarrays.
result = []
# Compute total array sum
sum = 0
for i in range(0, n, 1):
sum += arr[i]
curr_sum = 0 # Current Sum
prev_index = -1 # Index of previous subarray
for i in range(0, n, 1):
curr_sum += arr[i]
# If current point is a break point.
# Note that we don't compare actual
# averages to avoid floating point errors.
if (sum *(i - prev_index) == curr_sum * n):
# Update current sum and
# previous index
curr_sum = 0
prev_index = i
# Add current break point
result.append(i)
# If last break point was not end of
# array, we cannot break the whole array.
if (prev_index != n - 1):
print("Not Possible", end = " ")
# Printing the result in required format
print("( 0 ,", result[0], ")")
for i in range(1, len(result), 1):
print("(", result[i - 1] + 1, ",",
result[i],")")
# Driver Code
if __name__ == '__main__':
arr = [4, 6, 2, 4, 8, 0, 6, 2]
n = len(arr)
findSubarrays(arr, n)
# This code is contributed by
# Sanjit_Prasad
C#
// C# program to break given array into maximum
// number of subarrays with equal average.
using System;
using System.Collections.Generic;
class GFG
{
static void findSubarrays(int []arr, int n)
{
// To store all points where we can break
// given array into equal average subarrays.
List result = new List();
// Compute total array sum
int sum = 0;
for (int i = 0; i < n; i++)
sum += arr[i];
int curr_sum = 0; // Current Sum
int prev_index = -1; // Index of previous subarray
for (int i = 0; i < n ; i++)
{
curr_sum += arr[i];
// If current point is a break point. Note that
// we don't compare actual averages to avoid
// floating point errors.
if (sum *(i - prev_index) == curr_sum*n)
{
// Update current sum and previous index
curr_sum = 0;
prev_index = i;
// Add current break point
result.Add(i);
}
}
// If last break point was not end of array, we
// cannot break the whole array.
if (prev_index != n-1)
{
Console.Write("Not Possible");
return;
}
// Printing the result in required format
Console.Write("(0, " + result[0] + ")\n");
for (int i = 1; i < result.Count; i++)
Console.Write("(" + (result[i-1] + 1) + ", "
+ result[i] + ")\n");
}
// Driver code
public static void Main()
{
int []arr = {4, 6, 2, 4, 8, 0, 6, 2};
int n = arr.Length;
findSubarrays(arr, n);
}
}
// This code is contributed by PrinciRaj1992
Javascript
输出:
(0, 0)
(1, 2)
(3, 3)
(4, 5)
(6, 7)