【问题标题】:Smart phone Codechef problem logic confusion智能手机Codechef问题逻辑混乱
【发布时间】:2019-10-07 17:58:19
【问题描述】:

您正在开发智能手机应用程序。您有一个应用程序的潜在客户列表。每个客户都有预算,当且仅当价格低于或等于客户的预算时,他们才会以您声明的价格购买应用。

您想确定一个价格,以使您从应用中获得的收入最大化。找出这个可能的最大收入。

例如,假设您有 4 个潜在客户,他们的预算是 30、20、53 和 14。在这种情况下,您可以获得的最大收入是 60。

我的朋友告诉我,只需对数组进行排序并尝试使用

ar[i]*(n-i) 虽然我实施了 我没有理解整个逻辑。真的需要帮助解释

#include<bits/stdc++.h>
using namespace std;

int maximumProfit(int budget[], int n) {

    int ans=INT_MIN;
    sort(budget,budget+n);
    for(int i=0;i<n;i++)
    {
        ans=max(ans,budget[i]*(n-i));
    }
    return ans;
}

【问题讨论】:

  • 不相关:小心#include&lt;bits/stdc++.h&gt;using namespace std; 第一个包括整个C++ 标准库。那是成千上万个您没有使用的标识符,您现在必须避免重复使用。您可能甚至不知道存在许多这些标识符。我不。 using namespace std; 有效地将 std 命名空间拉入全局命名空间,在那里意外重用的可能性更大。
  • 相关:数据排序后,为什么要查找最大值或最小值?除非排序标准真的很奇怪,并且此代码使用默认标准,否则最小值将在数据集的一端,最大值将在另一端。让他们很容易找到。除非您提供了自定义 sort 或自定义 max 函数。在这种情况下,第一条评论变得更加相关。
  • @user4581301 代码正在尝试查找与budget[i] 不同的budget[i] * (n - i) 的最大值。
  • 解决方法:把代码收起来。用笔和纸算出逻辑。你会如何用你的mark I Brain解决这个问题?记下你的过程。这些注释将成为您必须指示计算机执行的步骤。

标签: c++ question-answering


【解决方案1】:

直觉:假设最优解中最穷的人的预算为 x。然后你总是可以选择 x 作为价格,因为其他人至少和你一样富有,而选择较低的价格只会减少你的收入(除非他不是最穷的)。意识到这一点后,您只需遍历客户以找到最佳解决方案中最差的人(可以有多个,但您选择所有这些人)。总收入是候选人的预算乘以至少同样富有的人数,即budget[i] * (n - i),因为预算按非递减顺序排序。

【讨论】:

    【解决方案2】:

    总客户N = 4

    (已排序)budget_list = [14, 20, 30, 53]

    固定价格 = 14,我们所有的客户都购买我们的产品

    收入 = 14 * 4 = 56,由budget_list[0] * (N)提供

    下一个价格 = 20,三个客户购买应用程序(即期望预算为 14 的客户)

    收入 = 20 * 3,由budget_list[1] * (N-1)提供

    因此,可以通过迭代 budget_list 的客户范围(N)来获得最大收入

    【讨论】:

      【解决方案3】:

      必须用 long long 代替 int

      #include <iostream>
      #include<bits/stdc++.h>
      
      using namespace std;
      
      long long maxp(long long arr[], long long n){
      sort(arr, arr+n);
      long long ans = arr[0];
      for(long long i=0; i<n; i++){
          ans=max(ans,arr[i]*(n-i));
      }
      cout<<ans;
      }
      
      int main() {
      long long n;
      cin>>n;
      long long arr[n];
      for(long long i=0; i<n; i++){
          cin>>arr[i];
      }
      maxp(arr, n);
      return 0;
      }
      

      【讨论】:

        【解决方案4】:

        这是解决这个问题的java代码:

        public static int maximumProfit(int budget[]) {

            int len = budget.length;
            int i = 0;
            int numOfBud = 0;
            int profit = 0;
            
            int[] profitArr = new int[len];
            
            while(i < len){
                
                int budgetToCompare = budget[i];
                
                for(int j=0; j<len; j++){
                    
                    if(budgetToCompare <= budget[j]){
                        numOfBud++;
                    }
                }
                
                profitArr[i] = budgetToCompare * numOfBud;
                numOfBud = 0;
                i++;
                
            }
            
            Arrays.sort(profitArr);
            
            profit = profitArr[len-1];
            return profit;
        }
        

        【讨论】:

          【解决方案5】:
           // first sort array
              Arrays.sort(budget);
              int cost[] = new int[budget.length];
              
              for(int i=0; i<budget.length; i++){
                  cost[i] = budget[i]*(budget.length-i);
              }
              int max = Integer.MIN_VALUE;
              
              for(int i:cost){
                  if(i>max){
                      max = i;
                  }
              }
              return max;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-10-01
            • 2021-06-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-02-19
            相关资源
            最近更新 更多