聪明phone Codechef问题逻辑混乱

Smart phone Codechef problem logic confusion

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

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

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

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

ar[i]*(n-i) 虽然我实施了 我没有完全理解 logic.really 需要帮助解释

#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;
}

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

客户总数 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)

的最大收入

必须使用 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;
}

这是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;
}
 // 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;