给定N 个顶点,其中N是偶数。最初,任何顶点之间都没有边。
您可以执行如下所示的操作:
- 在单个操作中,总节点可以分为两组,并且可以为u和v 的所有可能值绘制边(u,v) ,使得u和v都属于不同的组。
任务是找到将这些顶点转换为完整图所需的最小给定操作数。
例子:
Input: N = 4
Output: 2
Operation 1: Groups = [1, 2], [3, 4] all possible edges will be {1-4, 1-3, 2-3, 2-4}.
Operation 2: Groups = [1, 3], [2, 4] all possible edges will be {1-4, 1-3, 2-3, 2-4, 1-2, 3-4}.
Graph is now a complete graph.
Input: N = 10
Output: 4
方法:当每对顶点之间都有一条边时,一个图将被称为完全图。这里的问题可以通过分而治之的方法来解决。为了执行最少数量的操作,将顶点分成两组,每组有N / 2个顶点并绘制所有可能的边。现在观察我们必须在现在在同一组中的顶点之间创建边。所以我们将把它们分成两半,并将它们放在不同的组中。
这些步骤将重复进行,直到所有边都被绘制,即最大⌈ log2(N) ⌉次,因为操作会将边分成相等大小的两半。
下面是上述方法的实现:
C++
// C++ implementation of the approach
#include
using namespace std;
// Function to return
// the minimum number of steps required
int minOperations(int N)
{
double x = log2(N);
int ans = ceil(x);
return ans;
}
// Driver Code
int main()
{
int N = 10;
cout << minOperations(N);
return 0;
}
Java
// Java implementation of the approach
class GFG
{
// Function to return the minimum
// number of steps required
static int minOperations(int N)
{
double x = Math.log(N) / Math.log(2);
int ans = (int)(Math.ceil(x));
return ans;
}
// Driver Code
public static void main(String[] args)
{
int N = 10;
System.out.println(minOperations(N));
}
}
// This code is contributed by Ryuga
Python3
# Python 3 implementation of the approach
from math import log2, ceil
# Function to return the minimum
# number of steps required
def minOperations(N):
x = log2(N)
ans = ceil(x)
return ans
# Driver Code
if __name__ == '__main__':
N = 10
print(minOperations(N))
# This code is contributed by
# Surendra_Gangwar
C#
// C# implementation of the approach
using System;
class GFG
{
// Function to return the minimum
// number of steps required
static int minOperations(int N)
{
double x = Math.Log(N, 2);
int ans = (int)(Math.Ceiling(x));
return ans;
}
// Driver Code
static void Main()
{
int N = 10;
Console.WriteLine(minOperations(N));
}
}
// This code is contributed by mits
PHP
Javascript
输出:
4
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。