📜  最多两个朋友可以吃的糖果

📅  最后修改于: 2022-05-13 01:56:07.357000             🧑  作者: Mango

最多两个朋友可以吃的糖果

给定六个整数XYcnt1cnt2C1C2 ,其中:

  • XY代表两个朋友可以消耗的最大卡路里,
  • cnt1cnt2是两种糖果的编号,
  • C1C2是两种可用糖果中每种糖果中的卡路里。

任务是找到两个朋友可以吃的最大糖果数量。

例子:

方法:这个问题是基于观察的,可以通过使用贪心方法并尝试两个朋友可以从给定的cnt1cnt2糖果中消耗的糖果的所有可能组合并尝试首先完成卡路里值较低的糖果来解决。

请按照以下步骤解决给定的问题。

  • 如果糖果1的卡路里值大于糖果2的卡路里值,则交换两种糖果的卡路里值和计数,以确保首先消耗卡路里较少的糖果。
  • 用0初始化一个变量maxCandies ,存储两个朋友可以吃的最大糖果数量。
  • 运行从i = 0 到i = cnt1 (类型 1 的糖果数量)的循环以检查所有可能的组合:
    • 检查朋友 1 消耗的卡路里( i*C1 )是否大于他的最大卡路里容量( X )。如果是这种情况,则不执行进一步的语句,
    • 计算朋友 2 ( candy1_frnd2 ) 消耗的类型 1 糖果的数量。它由以下给出:
    • 计算朋友 1 和朋友 2 仍然可以消耗的卡路里容量(比如left_frnd1left_frnd2 )。它可以通过以下方式给出:
    • 分别计算朋友 1 和朋友 2 消耗的类型 2 糖果的数量(比如candy2_frnd1candy2_frnd2 )。它可以通过以下方式给出:
    • 更新两个朋友可以消耗的最大糖果数量:
  • 返回存储在maxCandies中的最终值

下面是上述方法的实现:

C++
// C++ code to implement the approach
 
#include 
using namespace std;
 
// Function to find the maximum count
int maxCount(int X, int Y, int cnt1,
             int cnt2, int C1, int C2)
{
    // If C1 > C2, swap them
    if (C1 > C2) {
        swap(C1, C2);
        swap(cnt1, cnt2);
    }
 
    int ans = 0;
 
    // Loop to find the
    // maximum count of candies
    for (int i = 0; i <= cnt1; i++) {
        if (i * C1 > X) {
            continue;
        }
        int ss = min(Y / C1, cnt1 - i);
        int left_wtf = X - i * C1;
        int left_wts = Y - ss * C1;
 
        int af = min(left_wtf / C2, cnt2);
        int as = min(left_wts / C2,
                     cnt2 - af);
 
        ans = max(ans, i + ss + af + as);
    }
    return ans;
}
 
// Driver code
int main()
{
    int X = 25, Y = 36, cnt1 = 10, cnt2 = 6;
    int C1 = 5, C2 = 4;
 
    // Function call
    int ans = maxCount(X, Y, cnt1,
                       cnt2, C1, C2);
    cout << ans << endl;
    return 0;
}


Java
// JAVA code to implement the approach
import java.util.*;
class GFG {
  public static void swap(int m, int n)
  {
    int temp = m;
    m = n;
    n = temp;
  }
 
  // Function to find the maximum count
  public static int maxCount(int X, int Y, int cnt1,
                             int cnt2, int C1, int C2)
  {
 
    // If C1 > C2, swap them
    if (C1 > C2) {
      swap(C1, C2);
      swap(cnt1, cnt2);
    }
 
    int ans = 0;
 
    // Loop to find the
    // maximum count of candies
    for (int i = 0; i <= cnt1; i++) {
      if (i * C1 > X) {
        continue;
      }
      int ss = Math.min(Y / C1, cnt1 - i);
      int left_wtf = X - i * C1;
      int left_wts = Y - ss * C1;
 
      int af = Math.min(left_wtf / C2, cnt2);
      int as = Math.min(left_wts / C2, cnt2 - af);
 
      ans = Math.max(ans, i + ss + af + as);
    }
    return ans;
  }
 
  // Driver code
  public static void main(String[] args)
  {
    int X = 25, Y = 36, cnt1 = 10, cnt2 = 6;
    int C1 = 5, C2 = 4;
 
    // Function call
    int ans = maxCount(X, Y, cnt1, cnt2, C1, C2);
    System.out.println(ans);
  }
}
 
// This code is contributed by Taranpreet


Python
# Python code to implement the approach
 
# Function to find the maximum count
def maxCount(X, Y, cnt1, cnt2, C1, C2):
 
    # If C1 > C2, swap them
    if (C1 > C2):
        C1, C2 = C2, C1
        cnt1, cnt2 = cnt2, cnt1
 
    ans = 0
 
    # Loop to find the
    # maximum count of candies
    for i in range(0, cnt1 + 1):
        if (i * C1 > X):
            continue
 
        ss = min(Y // C1, cnt1 - i)
        left_wtf = X - i * C1
        left_wts = Y - ss * C1
 
        af = min(left_wtf // C2, cnt2)
        as_ = min(left_wts // C2, cnt2 - af)
 
        ans = max(ans, i + ss + af + as_)
 
    return ans
 
# Driver code
X = 25
Y = 36
cnt1 = 10
cnt2 = 6
C1 = 5
C2 = 4
 
# Function call
ans = maxCount(X, Y, cnt1, cnt2, C1, C2)
print(ans)
 
# This code is contributed by Samim Hossain Mondal.


C#
// C# code to implement the approach
using System;
class GFG {
  static void swap(int m, int n)
  {
    int temp = m;
    m = n;
    n = temp;
  }
 
  // Function to find the maximum count
  static int maxCount(int X, int Y, int cnt1, int cnt2,
                      int C1, int C2)
  {
 
    // If C1 > C2, swap them
    if (C1 > C2) {
      swap(C1, C2);
      swap(cnt1, cnt2);
    }
 
    int ans = 0;
 
    // Loop to find the
    // maximum count of candies
    for (int i = 0; i <= cnt1; i++) {
      if (i * C1 > X) {
        continue;
      }
      int ss = Math.Min(Y / C1, cnt1 - i);
      int left_wtf = X - i * C1;
      int left_wts = Y - ss * C1;
 
      int af = Math.Min(left_wtf / C2, cnt2);
      int as_ = Math.Min(left_wts / C2, cnt2 - af);
 
      ans = Math.Max(ans, i + ss + af + as_);
    }
    return ans;
  }
 
  // Driver code
  public static void Main()
  {
    int X = 25, Y = 36, cnt1 = 10, cnt2 = 6;
    int C1 = 5, C2 = 4;
 
    // Function call
    int ans = maxCount(X, Y, cnt1, cnt2, C1, C2);
    Console.WriteLine(ans);
  }
}
 
// This code is contributed by Samim Hossain Mondal.


Javascript



输出
13

时间复杂度: O(N),其中 N 代表热量值较低的糖果类型。
辅助空间: O(1)