Given two integers **N** and **M** which denote the number of persons of **Type1** and **Type2** respectively. The task is to find the maximum number of teams that can be formed with these two types of persons. A team can contain either **2 persons of Type1 and 1 person of Type2** or **1 person of Type1 and 2 persons of Type2**.**Examples:**

Input:N = 2, M = 6Output:2

(Type1, Type2, Type2) and (Type1, Type2, Type2) are the two possible teams.Input:N = 4, M = 5Output:3

**Approach:** A greedy approach is to choose 2 persons from the group which has more members and 1 person from the group with lesser members and update the count of persons in each of the group accordingly. Termination condition will be when no more teams can be formed.

Below is the implementation of the above approach:

## C++

`// C++ implementation of the approach` `#include <bits/stdc++.h>` `using` `namespace` `std;` `// Function that returns true if it possible` `// to form a team with the given n and m` `bool` `canFormTeam(` `int` `n, ` `int` `m)` `{` ` ` `// 1 person of Type1 and 2 persons of Type2` ` ` `// can be chosen` ` ` `if` `(n >= 1 && m >= 2)` ` ` `return` `true` `;` ` ` `// 1 person of Type2 and 2 persons of Type1` ` ` `// can be chosen` ` ` `if` `(m >= 1 && n >= 2)` ` ` `return` `true` `;` ` ` `// Cannot from a team` ` ` `return` `false` `;` `}` `// Function to return the maximum number of teams` `// that can be formed` `int` `maxTeams(` `int` `n, ` `int` `m)` `{` ` ` `// To store the required count of teams formed` ` ` `int` `count = 0;` ` ` `while` `(canFormTeam(n, m)) {` ` ` `if` `(n > m) {` ` ` `// Choose 2 persons of Type1` ` ` `n -= 2;` ` ` `// And 1 person of Type2` ` ` `m -= 1;` ` ` `}` ` ` `else` `{` ` ` `// Choose 2 persons of Type2` ` ` `m -= 2;` ` ` `// And 1 person of Type1` ` ` `n -= 1;` ` ` `}` ` ` `// Another team has been formed` ` ` `count++;` ` ` `}` ` ` `return` `count;` `}` `// Driver code` `int` `main()` `{` ` ` `int` `n = 4, m = 5;` ` ` `cout << maxTeams(n, m);` ` ` `return` `0;` `}` |

## Java

`// Java implementation of the approach` `class` `GFG` `{` ` ` ` ` `// Function that returns true` ` ` `// if it possible to form a` ` ` `// team with the given n and m` ` ` `static` `boolean` `canFormTeam(` `int` `n, ` `int` `m)` ` ` `{` ` ` ` ` `// 1 person of Type1 and 2 persons` ` ` `// of Type2 can be chosen` ` ` `if` `(n >= ` `1` `&& m >= ` `2` `)` ` ` `return` `true` `;` ` ` ` ` `// 1 person of Type2 and 2 persons` ` ` `// of Type1 can be chosen` ` ` `if` `(m >= ` `1` `&& n >= ` `2` `)` ` ` `return` `true` `;` ` ` ` ` `// Cannot from a team` ` ` `return` `false` `;` ` ` `}` ` ` ` ` `// Function to return the maximum` ` ` `// number of teams that can be formed` ` ` `static` `int` `maxTeams(` `int` `n, ` `int` `m)` ` ` `{` ` ` `// To store the required count` ` ` `// of teams formed` ` ` `int` `count = ` `0` `;` ` ` ` ` `while` `(canFormTeam(n, m))` ` ` `{` ` ` `if` `(n > m)` ` ` `{` ` ` ` ` `// Choose 2 persons of Type1` ` ` `n -= ` `2` `;` ` ` ` ` `// And 1 person of Type2` ` ` `m -= ` `1` `;` ` ` `}` ` ` `else` ` ` `{` ` ` ` ` `// Choose 2 persons of Type2` ` ` `m -= ` `2` `;` ` ` ` ` `// And 1 person of Type1` ` ` `n -= ` `1` `;` ` ` `}` ` ` ` ` `// Another team has been formed` ` ` `count++;` ` ` `}` ` ` `return` `count;` ` ` `}` ` ` `// Driver code` ` ` `public` `static` `void` `main(String args[])` ` ` `{` ` ` `int` `n = ` `4` `, m = ` `5` `;` ` ` `System.out.println(maxTeams(n, m));` ` ` `}` `}` `// This code is contributed by Ryuga` |

## Python3

`# Python 3 implementation of the approach` `# Function that returns true if it possible` `# to form a team with the given n and m` `def` `canFormTeam(n, m):` ` ` `# 1 person of Type1 and 2 persons of Type2` ` ` `# can be chosen` ` ` `if` `(n >` `=` `1` `and` `m >` `=` `2` `):` ` ` `return` `True` ` ` `# 1 person of Type2 and 2 persons of Type1` ` ` `# can be chosen` ` ` `if` `(m >` `=` `1` `and` `n >` `=` `2` `):` ` ` `return` `True` ` ` `# Cannot from a team` ` ` `return` `False` `# Function to return the maximum number of teams` `# that can be formed` `def` `maxTeams(n, m):` ` ` `# To store the required count of teams formed` ` ` `count ` `=` `0` ` ` `while` `(canFormTeam(n, m)):` ` ` `if` `(n > m):` ` ` `# Choose 2 persons of Type1` ` ` `n ` `-` `=` `2` ` ` `# And 1 person of Type2` ` ` `m ` `-` `=` `1` ` ` ` ` `else` `:` ` ` `# Choose 2 persons of Type2` ` ` `m ` `-` `=` `2` ` ` `# And 1 person of Type1` ` ` `n ` `-` `=` `1` ` ` `# Another team has been formed` ` ` `count ` `+` `=` `1` ` ` `return` `count` `# Driver code` `if` `__name__ ` `=` `=` `'__main__'` `:` ` ` `n ` `=` `4` ` ` `m ` `=` `5` ` ` `print` `(maxTeams(n, m))` `# This code is contributed by` `# Surendra_Gangwar` |

## C#

`// C# implementation of the approach` `using` `System;` `class` `GFG` `{` ` ` `// Function that returns true if it possible` `// to form a team with the given n and m` `static` `bool` `canFormTeam(` `int` `n, ` `int` `m)` `{` ` ` `// 1 person of Type1 and 2 persons` ` ` `// of Type2 can be chosen` ` ` `if` `(n >= 1 && m >= 2)` ` ` `return` `true` `;` ` ` `// 1 person of Type2 and 2 persons` ` ` `// of Type1 can be chosen` ` ` `if` `(m >= 1 && n >= 2)` ` ` `return` `true` `;` ` ` `// Cannot from a team` ` ` `return` `false` `;` `}` `// Function to return the maximum` `// number of teams that can be formed` `static` `int` `maxTeams(` `int` `n, ` `int` `m)` `{` ` ` `// To store the required count` ` ` `// of teams formed` ` ` `int` `count = 0;` ` ` `while` `(canFormTeam(n, m))` ` ` `{` ` ` `if` `(n > m)` ` ` `{` ` ` `// Choose 2 persons of Type1` ` ` `n -= 2;` ` ` `// And 1 person of Type2` ` ` `m -= 1;` ` ` `}` ` ` `else` ` ` `{` ` ` `// Choose 2 persons of Type2` ` ` `m -= 2;` ` ` `// And 1 person of Type1` ` ` `n -= 1;` ` ` `}` ` ` `// Another team has been formed` ` ` `count++;` ` ` `}` ` ` `return` `count;` `}` `// Driver code` `public` `static` `void` `Main()` `{` ` ` `int` `n = 4, m = 5;` ` ` `Console.WriteLine(maxTeams(n, m));` `}` `}` `// This code is contributed by` `// tufan_gupta2000` |

## PHP

`<?php` `// PHP implementation of the approach` `// Function that returns true if it possible` `// to form a team with the given n and m` `function` `canFormTeam(` `$n` `, ` `$m` `)` `{` ` ` `// 1 person of Type1 and 2 persons` ` ` `// of Type2 can be chosen` ` ` `if` `(` `$n` `>= 1 && ` `$m` `>= 2)` ` ` `return` `true;` ` ` `// 1 person of Type2 and 2 persons` ` ` `// of Type1 can be chosen` ` ` `if` `(` `$m` `>= 1 && ` `$n` `>= 2)` ` ` `return` `true;` ` ` `// Cannot from a team` ` ` `return` `false;` `}` `// Function to return the maximum number` `// of teams that can be formed` `function` `maxTeams(` `$n` `, ` `$m` `)` `{` ` ` ` ` `// To store the required count` ` ` `// of teams formed` ` ` `$count` `= 0;` ` ` `while` `(canFormTeam(` `$n` `, ` `$m` `))` ` ` `{` ` ` `if` `(` `$n` `> ` `$m` `)` ` ` `{` ` ` `// Choose 2 persons of Type1` ` ` `$n` `-= 2;` ` ` `// And 1 person of Type2` ` ` `$m` `-= 1;` ` ` `}` ` ` `else` ` ` `{` ` ` `// Choose 2 persons of Type2` ` ` `$m` `-= 2;` ` ` `// And 1 person of Type1` ` ` `$n` `-= 1;` ` ` `}` ` ` `// Another team has been formed` ` ` `$count` `++;` ` ` `}` ` ` `return` `$count` `;` `}` `// Driver code` `$n` `= 4;` `$m` `= 5;` `echo` `maxTeams(` `$n` `, ` `$m` `);` `// This code is contributed by mits` `?>` |

## Javascript

`<script>` `// javascript implementation of the approach ` `// Function that returns true` ` ` `// if it possible to form a` ` ` `// team with the given n and m` ` ` `function` `canFormTeam(n, m)` ` ` `{` ` ` `// 1 person of Type1 and 2 persons` ` ` `// of Type2 can be chosen` ` ` `if` `(n >= 1 && m >= 2)` ` ` `return` `true` `;` ` ` `// 1 person of Type2 and 2 persons` ` ` `// of Type1 can be chosen` ` ` `if` `(m >= 1 && n >= 2)` ` ` `return` `true` `;` ` ` `// Cannot from a team` ` ` `return` `false` `;` ` ` `}` ` ` `// Function to return the maximum` ` ` `// number of teams that can be formed` ` ` `function` `maxTeams(n , m)` ` ` `{` ` ` ` ` `// To store the required count` ` ` `// of teams formed` ` ` `var` `count = 0;` ` ` `while` `(canFormTeam(n, m))` ` ` `{` ` ` `if` `(n > m)` ` ` `{` ` ` `// Choose 2 persons of Type1` ` ` `n -= 2;` ` ` `// And 1 person of Type2` ` ` `m -= 1;` ` ` `}` ` ` `else` ` ` `{` ` ` `// Choose 2 persons of Type2` ` ` `m -= 2;` ` ` `// And 1 person of Type1` ` ` `n -= 1;` ` ` `}` ` ` `// Another team has been formed` ` ` `count++;` ` ` `}` ` ` `return` `count;` ` ` `}` ` ` `// Driver code` ` ` `var` `n = 4, m = 5;` ` ` `document.write(maxTeams(n, m));` `// This code is contributed by todaysgaurav` `</script>` |

**Output:**

3

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the **DSA Self Paced Course** at a student-friendly price and become industry ready. Get hold of all the important mathematical concepts for competitive programming with the **Essential Maths for CP Course** at a student-friendly price.

In case you wish to attend live classes with industry experts, please refer **Geeks Classes Live**