📜  给定数量可以满足的最大客户数量

📅  最后修改于: 2021-04-27 23:04:10             🧑  作者: Mango

新品种的大米已经进入超级市场,并且首次面世,这种大米的数量是有限的。每个客户都要求将米装在大小为a和大小为b的两种不同包装中。 a和b的大小由工作人员根据需求确定。
给定小包a和b的大小,可用大米的总量d和顾客数量n,找出给定数量的大米可以满足的最大顾客数量。
显示可以满足的客户总数和可以满足的客户指数。

注意:如果客户订购2 3,则需要2个大小为a的数据包和3个大小为b的数据包。假设客户索引从1开始。

输入:
输入的第一行包含两个整数n和d。下一行包含两个整数a和b。接下来的n行为每个客户包含两个整数,表示客户所需的大小为a和大小为b的袋子总数。

输出:
打印可以满足的最大客户数量,并在下一行中打印满意客户的空格分隔的索引。

例子:

Input : n = 5, d = 5
        a = 1, b = 1
        2 0
        3 2
        4 4
        10 0
        0 1
Output : 2
         5 1 

Input : n = 6, d = 1000000000
       a = 9999, b = 10000
       10000 9998
       10000 10000
       10000 10000
       70000 70000
       10000 10000
       10000 10000
Output : 5
         1 2 3 5 6 

解释:
在第一个示例中,客户根据其需求的顺序为:

Customer ID   Demand
   5            1
   1            2
   2            5
   3            8
   4            10

由此可以很容易地得出结论,对于总需求1 + 2 = 3,只有客户5和客户1可以满足。其余客户不能购买剩余的大米,因为他们的需求大于可用量。

方法:
为了满足最大数量的顾客的需求,我们必须从需求最小的顾客开始,以便我们有最大的剩余大米以满足剩余顾客的需求。因此,根据需求的增加顺序对客户进行分类,以便可以满足最大数量的客户。

下面是上述方法的实现:

C++
// CPP program to find maximum number 
// of customers that can be satisfied
#include 
using namespace std;
  
vector > v;
  
// print maximum number of satisfied
// customers and their indexes 
void solve(int n, int d, int a, int b, 
                        int arr[][2])
{
    // Creating an vector of pair of 
    // total demand and customer number
    for (int i = 0; i < n; i++) {
        int m = arr[i][0], t = arr[i][1];
        v.push_back(make_pair((a * m + b * t),
                                     i + 1));
    }
      
    // Sorting the customers according
    // to their total demand
    sort(v.begin(), v.end());
      
    vector ans;
      
    // Taking the first k customers that
    // can be satisfied by total amount d
    for (int i = 0; i < n; i++) {
        if (v[i].first <= d) {
            ans.push_back(v[i].second);
            d -= v[i].first;
        }
    }
      
    cout << ans.size() << endl;    
    for (int i = 0; i < ans.size(); i++)
        cout << ans[i] << " ";
}
  
// Driver program
int main()
{
    // Initializing variables
    int n = 5;
    long d = 5;
    int a = 1, b = 1;
    int arr[][2] = {{2, 0},
                    {3, 2},
                    {4, 4},
                    {10, 0},
                    {0, 1}};
      
    solve(n, d, a, b, arr);
    return 0;
}


Python3
# Python3 program to find maximum number 
# of customers that can be satisfied 
v = []
  
# print maximum number of satisfied 
# customers and their indexes 
def solve(n, d, a, b, arr):
    first, second = 0, 1
      
    # Creating an vector of pair of 
    # total demand and customer number 
    for i in range(n):
        m = arr[i][0]
        t = arr[i][1] 
        v.append([a * m + b * t, i + 1])
      
    # Sorting the customers according 
    # to their total demand 
    v.sort()
      
    ans = [] 
      
    # Taking the first k customers that 
    # can be satisfied by total amount d 
    for i in range(n):
        if v[i][first] <= d: 
            ans.append(v[i][second]) 
            d -= v[i][first]
      
    print(len(ans))
    for i in range(len(ans)):
        print(ans[i], end = " ")
  
# Driver Code
if __name__ == '__main__': 
      
    # Initializing variables 
    n = 5
    d = 5
    a = 1
    b = 1
    arr = [[2, 0], [3, 2],  
           [4, 4], [10, 0], 
           [0, 1]] 
      
    solve(n, d, a, b, arr)
  
# This code is contributed by PranchalK


输出:

2
5 1