给定一个数组arr []和一个整数K ,任务是找到更改大小为N的数组B (包含全零)以使B的每个元素都大于或等于arr所需的最小操作数。即arr [i]> = B [i]。在任何操作中,您都可以选择B大小为K的子数组,并将该子数组的所有元素加1。
例子:
Input: arr[] = {1, 2, 3, 4, 5}, K = 2
Output: 9
Explanation:
At first B[] = {0, 0, 0, 0, 0} operations = 0
Increment subarray a[1:2] by 1 => B = {1, 1, 0, 0, 0}, operations = 1
Increment subarray a[2:3] by 1 => B = {1, 2, 1, 0, 0}, operations = 2
Increment subarray a[3:4] by 2 => B = {1, 2, 3, 2, 0}, operations = 4
Increment subarray a[4:5] by 5 => B = {1, 2, 3, 7, 5}, operations = 9
Therefore, count of such operations required is 9.
Input: arr[] = {2, 3, 1}, K = 3
Output: 3
Explanation:
Incrementing the entire array by 3
方法:这个想法是,每当B [i]小于arr [i]时,就增加大小为K的子数组,并在每一步中将此类操作的计数增加1。要增加大小为K的子数组,请使用Odiff(1)中的差值数组进行范围查询更新。
下面是上述方法的实现:
C++
// C++ implementation to find the
// minimum number of operations
// required to change an array of
// all zeros such that every element
// is greater than the given array
#include
using namespace std;
// Function to find the minimum
// number of operations required
// to change all the array of zeros
// such that every element is greater
// than the given array
int find_minimum_operations(int n, int b[],
int k)
{
// Declaring the difference
// array of size N
int d[n + 1] = {0};
// Number of operations
int operations = 0, need;
for(int i = 0; i < n; i++)
{
// First update the D[i] value
// with the previous value
if (i > 0)
{
d[i] += d[i - 1];
}
// The index i has to be incremented
if (b[i] > d[i])
{
// We have to perform
// (b[i]-d[i]) operations more
operations += b[i] - d[i];
need = b[i] - d[i];
// Increment the range
// i to i + k by need
d[i] += need;
// Check if i + k is valid index
if(i + k <= n)
{
d[i + k]-= need;
}
}
}
cout << operations << endl;
}
// Driver Code
int main()
{
int n = 5;
int b[] = { 1, 2, 3, 4, 5 };
int k = 2;
// Function Call
find_minimum_operations(n, b, k);
return 0;
}
// This code is contributed by shubhamsingh10
Java
// Java implementation to find the
// minimum number of operations
// required to change an array of
// all zeros such that every element
// is greater than the given array
class GFG{
// Function to find the minimum
// number of operations required
// to change all the array of zeros
// such that every element is greater
// than the given array
static void find_minimum_operations(int n, int b[],
int k)
{
// Declaring the difference
// array of size N
int d[] = new int[n + 1];
// Number of operations
int i, operations = 0, need;
for(i = 0; i < n; i++)
{
// First update the D[i] value
// with the previous value
if (i > 0)
{
d[i] += d[i - 1];
}
// The index i has to be incremented
if (b[i] > d[i])
{
// We have to perform
// (b[i]-d[i]) operations more
operations += b[i] - d[i];
need = b[i] - d[i];
// Increment the range
// i to i + k by need
d[i] += need;
// Check if i + k is valid index
if(i + k <= n)
{
d[i + k]-= need;
}
}
}
System.out.println(operations);
}
// Driver Code
public static void main (String []args)
{
int n = 5;
int b[] = { 1, 2, 3, 4, 5 };
int k = 2;
// Function Call
find_minimum_operations(n, b, k);
}
}
// This code is contributed by chitranayal
Python3
# Python3 implementation to find the
# minimum number of operations required
# to change an array of all zeros
# such that every element is greater than
# the given array
# Function to find the minimum
# number of operations required
# to change all the array of zeros
# such that every element is greater
# than the given array
def find_minimum_operations(n, b, k):
# Declaring the difference
# array of size N
d =[0 for i in range(n + 1)]
# Number of operations
operations = 0
for i in range(n):
# First update the D[i] value with
# the previous value
d[i]+= d[i-1]
# The index i has to be incremented
if b[i]>d[i]:
# We have to perform
# (b[i]-d[i]) operations more
operations+=(b[i]-d[i])
need =(b[i]-d[i])
# Increment the range
# i to i + k by need
d[i]+= need
# Check if i + k is valid index
if i + k<= n:
d[i + k]-= need
return operations
# Driver Code
if __name__ == "__main__":
n = 5
b =[1, 2, 3, 4, 5]
k = 2
# Function Call
print(find_minimum_operations(n, b, k))
C#
// C# implementation to find the
// minimum number of operations
// required to change an array of
// all zeros such that every element
// is greater than the given array
using System;
class GFG{
// Function to find the minimum
// number of operations required
// to change all the array of zeros
// such that every element is greater
// than the given array
static void find_minimum_operations(int n, int[] b,
int k)
{
// Declaring the difference
// array of size N
int[] d = new int[n + 1];
// Number of operations
int i, operations = 0, need;
for(i = 0; i < n; i++)
{
// First update the D[i] value
// with the previous value
if (i > 0)
{
d[i] += d[i - 1];
}
// The index i has to be incremented
if (b[i] > d[i])
{
// We have to perform
// (b[i]-d[i]) operations more
operations += b[i] - d[i];
need = b[i] - d[i];
// Increment the range
// i to i + k by need
d[i] += need;
// Check if i + k is valid index
if(i + k <= n)
{
d[i + k]-= need;
}
}
}
Console.Write(operations);
}
// Driver Code
public static void Main (string []args)
{
int n = 5;
int[] b = { 1, 2, 3, 4, 5 };
int k = 2;
// Function Call
find_minimum_operations(n, b, k);
}
}
// This code is contributed by rock_cool
Javascript
9
时间复杂度:O(N)