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