以下是我尝试练习的在线编程竞赛之一的问题 我已经解决了,但我一直在寻找更有效的解决方案。
问题:
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;
}
这是我能想到的最好的解决方案 请提出有效的解决方案。
由于
答案 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/