聪明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;
您正在开发智能手机应用程序。您有您的应用程序的潜在客户列表。每个客户都有预算,当且仅当价格小于或等于客户的预算时,他们才会以您声明的价格购买应用程序。
您想确定一个价格,以使您从应用中获得的收入最大化。找出这个最大可能收入。
例如,假设您有 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;