algorithm - 寻找有效的算法

标签 algorithm sorting time-complexity

    You are developing a smartphone app. You have a list of potential
    customers for your app. Each customer has a budget and will buy the app at
    your declared price if and only if the price is less than or equal to the
    customer's budget.
    You want to fix a price so that the revenue you earn from the app is
    maximized. Find this maximum possible revenue.
    For instance, suppose you have 4 potential customers and their budgets are
    30, 20, 53 and 14. In this case, the maximum revenue you can get is 60.
**Input format**
Line 1 : N, the total number of potential customers.
Lines 2 to N+1: Each line has the budget of a potential customer.
**Output format**
The output consists of a single integer, the maximum possible revenue you
can earn from selling your app.

  Also, upper bound on N is 5*(10^5) and upper bound on each customer's budget is 10^8.

这是我要解决的问题。我的策略是对预算列表进行排序,然后将每个预算与其在序列中的位置索引相乘——然后打印结果序列的最大值。然而,这似乎非常耗时(至少在我实现它的方式上 - 我附上了代码以供引用)。我的时间上限是 2 秒。谁能帮我找一个 更省时的算法(或者可能是实现我的算法的更有效方法)?

这是我的解决方案:

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

using namespace std;

long long max(long long[],long long);
void quickSortIterative(long long[],long long,long long);
long long partition(long long[],long long,long long);
void swap(long long*,long long*);

int main(){
    long long n,k=1;
    scanf("%lld",&n);
    if(n<1 || n > 5*((long long)pow(10,5))){
        exit(0);
    }
    long long budget[n],aux[n];
    for(long long i=0;i<n;i++){
        scanf("%lld",&budget[i]);
        if(budget[i]<1 || budget[i] > (long long)pow(10,8)){
             exit(0);
        }
    }
    quickSortIterative(budget,0,n-1);
    for(long long j=n-1;j>=0;j--){
        aux[j] = budget[j]*k;
        k++;
    }
    cout<<max(aux,n);
    return 0;
}

long long partition (long long arr[], long long l, long long h){
    long long x = arr[h];
    long long i = (l - 1);

    for (long long j = l; j <= h- 1; j++)
    {
        if (arr[j] <= x)
        {
            i++;
            swap (&arr[i], &arr[j]);
        }
    }
    swap (&arr[i + 1], &arr[h]);
    return (i + 1);
}

void swap ( long long* a, long long* b ){
    long long t = *a;
    *a = *b;
    *b = t;
}

void quickSortIterative(long long arr[], long long l, long long h){
    long long stack[ h - l + 1 ];
    long long top = -1;
    stack[ ++top ] = l;
    stack[ ++top ] = h;
    while ( top >= 0 ){

        h = stack[ top-- ];
        l = stack[ top-- ];
        long long p = partition( arr, l, h );
        if ( p-1 > l ){
            stack[ ++top ] = l;
            stack[ ++top ] = p - 1;
        }
        if ( p+1 < h ){
            stack[ ++top ] = p + 1;
            stack[ ++top ] = h;
        }
    }
} 

long long max(long long arr[],long long length){
    long long max = arr[0];
    for(long long i=1;i<length;i++){
        if(arr[i]>max){
            max=arr[i];
        }
    }
    return max;
}

最佳答案

对于某些序列,快速排序可能需要 O(n^2) 时间(通常已经排序的序列是错误的)。

我建议您尝试使用具有保证 O(nlogn) 性能的排序方法(例如堆排序或合并排序)。或者,您可能会发现使用标准库中的排序例程会提供比您的版本更好的性能。

关于algorithm - 寻找有效的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27203387/

相关文章:

algorithm - 匹配二进制模式包括 "don' t cares"

java - 输入已知的算法的时间复杂度?

javascript - 如何从中间开始对数组进行排序?

algorithm - 在以下这些情况下,哪种排序算法最好?

Python3 list.count()时间复杂度

javascript - 在没有 Math.max() 的情况下查找一串数字中的最大值

python - 如何重新排列这样的列表(python)?

javascript - 如何将列表的内部文本/内部内容设置为多维数组的内容?

arrays - 在 O(n) 中查找总和为零的子数组的数量

algorithm - BST 时间分析