C++ 智能手机Codechef问题逻辑混乱

C++ 智能手机Codechef问题逻辑混乱,c++,question-answering,C++,Question Answering,您正在开发智能手机应用程序。您有应用程序的潜在客户列表。每个客户都有一个预算,当且仅当价格低于或等于客户的预算时,才会以您宣布的价格购买应用程序 你想要确定一个价格,以便你从应用程序中获得的收入最大化。找到这个最大可能的收入 例如,假设您有4个潜在客户,他们的预算分别为30、20、53和14。在这种情况下,您可以获得的最大收入是60 我的朋友告诉我,只需对数组进行排序并尝试使用 ar[i]*(n-i) 虽然我实现了 我不理解全部逻辑。我真的需要帮助解释 #include<bits/stdc

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

你想要确定一个价格,以便你从应用程序中获得的收入最大化。找到这个最大可能的收入

例如,假设您有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;
}
#包括
使用名称空间std;
int最大利润(int预算[],int n){
int ans=int_MIN;
排序(预算,预算+n);

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

客户总数
N
=
4

(已排序)
预算列表
=
[14,20,30,53]

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

收入=14*4=56,由预算清单[0]*(N)

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

收入=20*3,由预算清单[1]*(N-1)


因此,对于一系列客户(
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;
}
#包括
#包括
使用名称空间std;
长-长最大值(长-长arr[],长-长n){
排序(arr,arr+n);
长ans=arr[0];
对于(长i=0;iarr[i];
}
maxp(arr,n);
返回0;
}

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

公共静态整数最大利润(整数预算[]){

int len=budget.length;
int i=0;
int numobud=0;
国际利润=0;
int[]profitArr=新的int[len];
而(我对于(int j=0;un-Realth:Actual> <代码> >包含<命名空间STD;< /Cord>;<代码> >第一个包括整个C++标准库。这是成千上万个你现在不必使用的标识符。你可能不知道这些标识符中的许多。我不使用.<代码>使用命名空间ST。d、 
有效地将
std
名称空间拉入全局名称空间,在全局名称空间中意外重用的可能性更大。相关:一旦对数据进行了排序,为什么要查找最大值或最小值?除非排序标准真的很奇怪,并且此代码使用默认标准,否则最小值将位于数据集的一端,最大值为value将在另一端。使它们很容易找到。除非您提供了自定义
排序
或自定义
max
函数。在这种情况下,第一条注释变得更加相关。@user4581301代码正在尝试查找
预算[i]*(n-i)
的最大值,这与
预算[i]不同
。如何解决问题:把代码收起来。用笔和纸计算出逻辑。你将如何用你的mark I大脑解决这个问题?记下你的过程。这些笔记将成为你必须指导计算机执行的步骤。
    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;
}