使用模 3 下的增量均衡数组
给定一个包含 N 个非负整数的数组 A。只能对数组进行以下操作:
A[i] = ( A[i] + 1 ) % 3
其中 A[i] 是数组 A 中索引 i 处的元素,执行此操作一次需要 1 个单位。找到使所有元素相等的最小成本。
例子 :
Input : 1 0 3 2
Output : 4 units
Explanation: First 3 is converted to 1(3 + 1 % 3 = 1).
Then, if we try to make all elements equal to 1, then
converting 0 to 1 will cost "1" and 2 to 1 will cost "2".
Therefore, in total cost=3 + 1(to convert 3 to 1) = 4,
which is minimum.
Input : 98 4 3 1
Output : 6 units
Explanation: 98, 4 and 3 are converted to 0, 2 and 1.
So, now array becomes {0, 2, 1, 1}. If we try to convert
every element in our new array equal to 1, then converting
0 to 1 will cost "1" and 2 to 1 will cost "2". So, total
cost= 3+ 3(conversion of 98, 4 and 3) = 6, which is the minimum cost.
方法:首先,我们将尝试将所有大于 2 的数字转换为 0 到 2 之间的数字。因为使用唯一允许的操作 A(i)=(A(i),从 0 到 2 的数字不会超过 2 +1) % 3(无论我们执行多少次此操作)。然后我们将修复 3 个可能值之一(0 到 2)并找到使所有元素都等于它的成本。
三者中的最低成本 + 将所有大于 2 的数字转换为 0 到 2 之间的数字的额外成本将是我们的答案。我们需要在这里查看的一个特殊情况是,如果默认情况下所有元素都相等(如数组{7, 7, 7, 7}),那么我们的答案将是零。
C++
// CPP program to find minimum cost to
// equalize an array with increment under
// modulo 3 operation.
#include
using namespace std;
int mincost(int a[], int n)
{
int c = 1;
// loop to check whether all
// elements are equal or not
for (int i = 0; i < n; i++)
if (a[i] == a[i + 1])
c++;
// A special case when all
// elements are equal
if (c == n)
return 0;
// variable that counts total
// numbers greater 2
int x = 0;
// loop to convert all numbers greater
// than 2 to a range between 0 to 2.
for (int i = 0; i < n; i++)
{
if (a[i] > 2) {
// number greater than 2 gets
// converted to a number between 0 to 2.
a[i] = (a[i] + 1) % 3;
x += 1;
}
}
// variables to count 3 possible ways
// to make all elements equal after
// reducing them to range [0, 2]
int c0 = 0, c1 = 0, c2 = 0;
// loop that counts total cost to
// make all elements equal to 0.
for (int i = 0; i < n; i++)
{
if (a[i] == 1) {
// since we will have to use the
// operation 2 times to convert 1 to 0
// (1+1)%3=2 and then (2+1)%3=0
c0 += 2;
}
// here we use it once since (2+1%3=0)
else if (a[i] == 2)
c0 += 1;
}
// loop that counts total cost to
// make all elements equal to 1
for (int i = 0; i < n; i++)
{
// since (2+1%3=0) and (0+1%3=1)
if (a[i] == 2)
c1 += 2;
// since (0+1%3=1)
else if (a[i] == 0)
c1 += 1;
}
// loop that counts total cost
// to make all elements equal to 2
for (int i = 0; i < n; i++) {
// since 0+1%3=1 and 1+1%3=2
if (a[i] == 0)
c2 += 2;
else if (a[i] == 1)
c2 += 1;
}
// finally the one with minimum
// cost will be our answer
return x + min({ c0, c1, c2 });
}
// Driver program to run above function
int main()
{
int a[] = { 98, 4, 3, 1 };
int n = sizeof(a)/sizeof(a[0]);
cout << mincost(a, n)<<" units";
return 0;
}
Java
// Java program to find minimum
// cost to equalize an array
// with increment under
// modulo 3 operation.
import java.io.*;
class GFG
{
// Function to find minimum cost
static int mincost(int a[], int n)
{
int c = 1;
// loop to check whether all
// elements are equal or not
for (int i = 0; i < n - 1; i++)
if (a[i] == a[i + 1])
c++;
// A special case when all
// elements are equal
if (c == n)
return 0;
// variable that counts total
// numbers greater 2
int x = 0;
// loop to convert all numbers
// greater than 2 to a range
// between 0 to 2.
for (int i = 0; i < n - 1; i++)
{
if (a[i] > 2)
{
// number greater than 2
// gets converted to a
// number between 0 to 2.
a[i] = (a[i] + 1) % 3;
x += 1;
}
}
// variables to count 3 possible
// ways to make all elements equal
// after reducing them to range [0, 2]
int c0 = 0, c1 = 0, c2 = 0;
// loop that counts total cost to
// make all elements equal to 0.
for (int i = 0; i < n - 1; i++)
{
if (a[i] == 1)
{
// since we will have to
// use the operation 2
// times to convert 1 to 0
// (1+1)%3=2 and then (2+1)%3=0
c0 += 2;
}
// here we use it
// once since (2+1%3=0)
else if (a[i] == 2)
c0 += 1;
}
// loop that counts total cost to
// make all elements equal to 1
for (int i = 0; i < n - 1; i++)
{
// since (2+1%3=0)
// and (0+1%3=1)
if (a[i] == 2)
c1 += 2;
// since (0+1%3=1)
else if (a[i] == 0)
c1 += 1;
}
// loop that counts total cost
// to make all elements equal to 2
for (int i = 0; i < n - 1; i++)
{
// since 0+1%3=1
// and 1+1%3=2
if (a[i] == 0)
c2 += 2;
else if (a[i] == 1)
c2 += 1;
}
// finally the one with minimum
// cost will be our answer
return x + Math.min(c0,
Math.min(c1, c2));
}
// Driver Code
public static void main (String[] args)
{
int a[] = new int[]{98, 4, 3, 1};
int n = a.length;
System.out.println(mincost(a, n) +
" " + "units");
}
}
// This code is contributed by ajit
Python3
# Python code to illustrate above approach
# function to calculate minimum cost
def mincost(a, n):
# loop to check whether all elements
# are equal or not
c = 1
for i in range(0, n-1):
if (a[i] == a[i + 1]):
c += 1
# A special case when all elements
# are equal
if (c == n):
return 0
# loop to count total no of conversion
# of numbers greater than 2 to a
# number between 0 to 2.
x = 0
for i in range(n):
if a[i]>2:
a[i]=(a[i]+1)% 3
x += 1
# variables to count 3 possible ways
# to make all elements equal after
# reducing them to range [0, 2]
c0 = c1 = c2 = 0
# loop that counts total cost to
# make all elements equal to 0.
for i in a:
if (i == 1):
c0+= 2
elif (i == 2):
c0+= 1
# loop that counts total cost to
# make all elements equal to 1.
for i in a:
if (i == 0):
c1+= 1
elif (i == 2):
c1+= 2
# loop that counts total cost to
# make all elements equal to 2.
for i in a:
if (i == 0):
c2+= 2
elif (i == 1):
c2+= 1
# finally the one with minimum cost
# plus the extra cost to convert numbers
# greater than 2 will be our answer
return min(c1, c2, c0)+x
# Driver code
n = 4
a = [98, 4, 3, 1]
c = 1
print(mincost(a, n), "units")
C#
// C# program to find minimum cost to
// equalize an array with increment
// under modulo 3 operation.
using System;
class GFG {
// Function to find minimum cost
static int mincost(int []a, int n)
{
int c = 1;
// loop to check whether all
// elements are equal or not
for (int i = 0; i < n - 1; i++)
if (a[i] == a[i + 1])
c++;
// A special case when all
// elements are equal
if (c == n)
return 0;
// variable that counts total
// numbers greater 2
int x = 0;
// loop to convert all numbers greater
// than 2 to a range between 0 to 2.
for (int i = 0; i < n - 1; i++)
{
if (a[i] > 2) {
// number greater than 2 gets
// converted to a number
// between 0 to 2.
a[i] = (a[i] + 1) % 3;
x += 1;
}
}
// variables to count 3 possible ways
// to make all elements equal after
// reducing them to range [0, 2]
int c0 = 0, c1 = 0, c2 = 0;
// loop that counts total cost to
// make all elements equal to 0.
for (int i = 0; i < n - 1; i++)
{
if (a[i] == 1)
{
// since we will have to use the
// operation 2 times to convert 1 to 0
// (1+1)%3=2 and then (2+1)%3=0
c0 += 2;
}
// here we use it once since (2+1%3=0)
else if (a[i] == 2)
c0 += 1;
}
// loop that counts total cost to
// make all elements equal to 1
for (int i = 0; i < n - 1; i++)
{
// since (2+1%3=0) and (0+1%3=1)
if (a[i] == 2)
c1 += 2;
// since (0+1%3=1)
else if (a[i] == 0)
c1 += 1;
}
// loop that counts total cost
// to make all elements equal to 2
for (int i = 0; i < n - 1; i++)
{
// since 0+1%3=1 and 1+1%3=2
if (a[i] == 0)
c2 += 2;
else if (a[i] == 1)
c2 += 1;
}
// finally the one with minimum
// cost will be our answer
return x + Math.Min(c0,
Math.Min(c1, c2) );
}
// Driver Code
public static void Main()
{
int []a = new int[]{98, 4, 3, 1};
int n = a.Length;
Console.Write(mincost(a, n) +
" " + "units");
}
}
// This code is contributed by Sam007.
PHP
2)
{
// number greater than 2
// gets converted to a
// number between 0 to 2.
$a[$i] = ($a[$i] + 1) % 3;
$x += 1;
}
}
// variables to count 3
// possible ways to make
// all elements equal after
// reducing them to range [0, 2]
$c0 = 0; $c1 = 0; $c2 = 0;
// loop that counts total
// cost to make all elements
// equal to 0.
for ($i = 0; $i < $n; $i++)
{
if ($a[$i] == 1)
{
// since we will have to
// use the operation 2
// times to convert 1 to 0
// (1+1)%3=2 and then (2+1)%3=0
$c0 += 2;
}
// here we use it
// once since (2+1%3=0)
else if ($a[$i] == 2)
$c0 += 1;
}
// loop that counts total
// cost to make all
// elements equal to 1
for ($i = 0; $i < $n; $i++)
{
// since (2+1%3=0) and
// (0+1%3=1)
if ($a[$i] == 2)
$c1 += 2;
// since (0+1%3=1)
else if ($a[$i] == 0)
$c1 += 1;
}
// loop that counts total
// cost to make all
// elements equal to 2
for ($i = 0; $i < $n; $i++)
{
// since 0+1%3=1
// and 1+1%3=2
if ($a[$i] == 0)
$c2 += 2;
else if ($a[$i] == 1)
$c2 += 1;
}
// finally the one with
// minimum cost will
// be our answer
return $x + min($c0, $c1, $c2 );
}
// Driver Code
$a = array(98, 4, 3, 1);
$n = sizeof($a);
echo mincost($a, $n), " units";
// This code is contributed by ajit
?>
Javascript
输出 :
6 units
时间复杂度: O(n)