给定一个由偶数组成的数组arr[] 。在每次移动时,您可以从数组中选择任何偶数X并将所有出现的X除以2 。任务是找到所需的最小移动次数,以使数组中的所有元素都变为奇数。
例子:
Input: arr[] = {40, 6, 40, 20}
Output: 4
Move 1: Select 40 and divide all the occurrences
of 40 by 2 to get {20, 6, 20, 20}
Move 2: Select 20 and divide all the occurrences
of 20 by 2 to get {10, 6, 10, 10}
Move 3: Select 10 and divide all the occurrences
of 10 by 2 to get {5, 6, 5, 5}.
Move 4: Select 6 and divide it by 2 to get {5, 3, 5, 5}.
Input: arr[] = {2, 4, 16, 8}
Output: 4
方法:这个问题可以使用贪心方法解决。在每次移动时,取数组中剩余的最大偶数并将其除以 2。取最大值是因为它除以 2 后有可能与数组中的其他元素相等,从而使总数最小操作。
下面是上述方法的实现:
C++
// C++ implementation of the approach
#include
using namespace std;
// Function to return the count of
// minimum operations required
int minOperations(int arr[], int n)
{
// Insert all the elements in a set
set s;
for (int i = 0; i < n; i++) {
s.insert(arr[i]);
}
// To store the number of moves
int moves = 0;
// While the set is not empty
while (s.empty() == 0) {
// The last element of the set
int z = *(s.rbegin());
// If the number is even
if (z % 2 == 0) {
moves++;
s.insert(z / 2);
}
// Remove the element from the set
s.erase(z);
}
return moves;
}
// Driver code
int main()
{
int arr[] = { 40, 6, 40, 20 };
int n = sizeof(arr) / sizeof(int);
cout << minOperations(arr, n);
return 0;
}
Java
// Java implementation of the approach
import java.io.*;
import java.util.*;
class GFG
{
// Function to return the count of
// minimum operations required
static int minOperations(int arr[], int n)
{
// Insert all the elements in a set
TreeSet s = new TreeSet();
for (int i = 0; i < n; i++)
{
s.add(arr[i]);
}
// To store the number of moves
int moves = 0;
// While the set is not empty
while (s.size() != 0)
{
// The last element of the set
Integer z = s.last();
// If the number is even
if (z % 2 == 0)
{
moves++;
s.add(z / 2);
}
// Remove the element from the set
s.remove(z);
}
return moves;
}
// Driver code
public static void main (String[] args)
{
int arr[] = { 40, 6, 40, 20 };
int n = arr.length;
System.out.println(minOperations(arr, n));
}
}
// This code is contributed by ApurvaRaj
Python3
# Python3 implementation of the approach
from collections import OrderedDict as mpp
# Function to return the count of
# minimum operations required
def minOperations(arr, n):
# Insert all the elements in a set
s = mpp()
for i in range(n):
s[arr[i]] = 1
# To store the number of moves
moves = 0
# While the set is not empty
while (len(s) > 0):
# The last element of the set
z = sorted(list(s.keys()))[-1]
# If the number is even
if (z % 2 == 0):
moves += 1
s[z / 2] = 1
# Remove the element from the set
del s[z]
return moves
# Driver code
arr = [40, 6, 40, 20]
n = len(arr)
print(minOperations(arr, n))
# This code is contributed by mohit kumar 29
C#
// C# implementation of the approach
using System;
using System.Collections.Generic;
class GFG
{
// Function to return the count of
// minimum operations required
static int minOperations(int []arr, int n)
{
// Insert all the elements in a set
SortedSet s = new SortedSet();
for (int i = 0; i < n; i++)
{
s.Add(arr[i]);
}
// To store the number of moves
int moves = 0;
// While the set is not empty
while (s.Count != 0)
{
// The last element of the set
int z = s.Max;
// If the number is even
if (z % 2 == 0)
{
moves++;
s.Add(z / 2);
}
// Remove the element from the set
s.Remove(z);
}
return moves;
}
// Driver code
public static void Main(String[] args)
{
int []arr = { 40, 6, 40, 20 };
int n = arr.Length;
Console.WriteLine(minOperations(arr, n));
}
}
// This code is contributed by 29AjayKumar
Javascript
输出:
4
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。