📜  最大化接收巧克力的人数

📅  最后修改于: 2021-09-06 06:27:42             🧑  作者: Mango

给定两个数组A[] ,由N 个整数组成,B[]由 M 种巧克力的口味值和一个整数X 组成,任务是根据条件找到可以收到巧克力的最大人数:一个人只能拥有一种巧克力,其口味值在[A[i] – X, A[i] + X] 范围内
注意:巧克力一旦送给一个人,就不能再送给任何其他人。

例子:

方法:这个问题可以使用贪心技术/a> 和搜索来解决。这里的关键观察是对于任何i 个人,如果可能,分配具有该范围内的最小可能值的巧克力。否则,从结果中排除该人。请按照以下步骤操作:

  • 按非递减顺序对给定数组A[]B[] 进行排序。
  • 初始化一个多重集以存储数组B[]的元素。
  • 初始化变量count = 0 ,以存储收到巧克力的人数。
  • 遍历数组 A[] 并使用二分搜索或 lower_bound()找到可以分配给每个第 i 个人的最小巧克力值。检查该值是否在[a i – X, a i + X]范围内。
  • 如果发现为真,则增加count并从 multiset 中删除此巧克力的值。
  • 完成以上步骤后,打印count的值作为结果。

下面是上述方法的实现:

C++
// C++ program for the above approach
#include 
using namespace std;
 
// Function to count the maximum number
// of persons receiving a chocolate
int countMaxPersons(int* A, int n, int* B,
                    int m, int x)
{
 
    // Initialize count as 0
    int count = 0;
 
    // Sort the given arrays
    sort(A, A + n);
    sort(B, B + m);
 
    // Initialize a multiset
    multiset s;
 
    // Insert B[] array values into
    // the multiset
    for (int i = 0; i < m; i++)
        s.insert(B[i]);
 
    // Traverse elements in array A[]
    for (int i = 0; i < n; i++) {
        int val = A[i] - x;
 
        // Search for the lowest value in B[]
        auto it = s.lower_bound(val);
 
        // If found, increment count,
        // and delete from set
        if (it != s.end()
            && *it <= A[i] + x) {
            count++;
            s.erase(it);
        }
    }
 
    // Return the number of people
    return count;
}
 
// Driver Code
int main()
{
    int A[] = { 90, 49, 20, 39, 49 };
    int B[] = { 14, 24, 82 };
    int X = 15;
    int N = sizeof(A) / sizeof(A[0]);
    int M = sizeof(B) / sizeof(B[0]);
 
    // Function Call
    cout << countMaxPersons(A, N, B, M, X);
}


Python3
# Python3 program for the above approach
from bisect import bisect_left
 
# Function to count the maximum number
# of persons receiving a chocolate
def countMaxPersons(A, n, B, m, x):
 
    # Initialize count as 0
    count = 0
 
    # Sort the given arrays
    A = sorted(A)
    B = sorted(B)
 
    # Initialize a multiset
    s = []
 
    # Insert B[] array values into
    # the multiset
    for i in range(m):
        s.append(B[i])
 
    # Traverse elements in array A[]
    for i in range(n):
        val = A[i] - x
 
        # Search for the lowest value in B[]
        it = bisect_left(s,val)
 
        # If found, increment count,
        # and delete from set
        if (it != len(s) and it <= A[i] + x):
            count += 1
            del s[it]
 
    # Return the number of people
    return count
 
# Driver Code
if __name__ == '__main__':
 
    A = [90, 49, 20, 39, 49]
    B = [14, 24, 82]
    X = 15
    N = len(A)
    M = len(B)
 
    # Function Call
    print(countMaxPersons(A, N, B, M, X))
 
    # This code is contributed by mohit kumar 29


输出:
3

时间复杂度: O(N*log N)
辅助空间: O(M)

如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live