需要更高效的解决方案

时间:2015-06-30 16:22:10

标签: c++ algorithm

以下是我尝试练习的在线编程竞赛之一的问题 我已经解决了,但我一直在寻找更有效的解决方案。

问题:
n个从左到右编号为1到n的对象 第i个物体的长度恰好是ai英尺 一组对象是该行的非空连续段。组的大小是该组中的对象数。组的强度是该组中对象的最小长度 对于每个x,使得1≤x≤n是所有大小为x的组中的最大强度。

输入
第一行输入包含整数n(1≤n≤2×10 ^ 5),即对象数 第二行包含由空格分隔的n个整数,a1,a2,...,a(1≤ai≤10^ 9),长度为对象。

输出
在一行中打印n个整数。对于从1到n的每个x,在所有x大小的组中打印最大强度。

示例测试用例:
输入

10个
1 2 3 4 5 4 3 2 1 6

输出
6 4 4 3 3 2 2 1 1 1

我的解决方案:

#include <iostream>

int row1[200000];
int row2[200000];
int max[200000];

int main()
{
    int bears;
    int next;
    int *old_row = NULL;
    int *curr_row = NULL;

    std::cin >> bears;
    std::cin >> next;

    row1[0] = next;
    max[0] = next;

    old_row = row1;
    curr_row = row2;

    for(int i = 1; i < bears; i++)
    {
        std::cin >> next;
        curr_row[0] = next;

        if (next > max[0])
        {
            max[0] = next;
        }

        for(int j = 1; j <= i; j++)
        {
            curr_row[j] = old_row[j-1] < next ? old_row[j-1] : next;
            if (curr_row[j] > max[j])
            {
                max[j] = curr_row[j];
            }
        }

        int *temp = old_row;
        old_row = curr_row;
        curr_row = temp;
    }

    for(int i = 0; i < bears; i++)
    {
        std::cout << max[i] << " ";
    }

    return 0;
}

这是我能想到的最好的解决方案 请提出有效的解决方案。

由于

2 个答案:

答案 0 :(得分:0)

实际上并不是答案。我发现以Python表达式的形式表达解决方案很有意思:

>>> d = [1, 2, 3, 4, 5, 4, 3, 2, 1, 6]
>>> print [max(min(d[i:i+l]) for i in range(len(d)-l+1)) for l in range(1,len(d)+1)]
[6, 4, 4, 3, 3, 2, 2, 1, 1, 1]

不是因为表现而是因为紧凑。

答案 1 :(得分:0)

如果你想自己设计一个实现,不要在这里给你代码。 (破坏你想要的练习。)但看看这些:

维基百科的文章总是很好的开始: https://en.wikipedia.org/wiki/Radix_sort

非常好,更深入的解释:https://www.cs.princeton.edu/~rs/AlgsDS07/18RadixSort.pdf

这实际上显示了如何做到这一点,不确定你是否想要: http://www.sanfoundry.com/cpp-program-implement-radix-sort/

相关问题