【发布时间】:2015-06-30 16:22:09
【问题描述】:
以下是我尝试练习的在线编程竞赛之一的问题。
我已经解决了,但我正在寻找更有效的解决方案。
问题:
从左到右有 n 个对象,从 1 到 n 编号。
第 i 个对象的长度正好是 ai 英尺。
一组对象是线的非空连续段。组的大小是该组中对象的数量。组的强度是该组中对象的最小长度。
对于每个 x 使得 1 ≤ x ≤ n 在所有大小为 x 的组中的最大强度。
输入
输入的第一行包含整数n(1 ≤ n ≤ 2 × 10^5),即对象的个数。
第二行包含 n 个用空格分隔的整数,a1, a2, ..., an (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;
}
这是我能想到的最佳解决方案。
请提出一个有效的解决方案。
谢谢
【问题讨论】:
-
提示:从最长到最短考虑对象并查看它们的位置。
-
这个问题更适合 Code Review SE 网站。
-
那么,您只是将一组整数从最大值排序到最小值?是的,有一些方法可以非常快地做到这一点 - 肯定比冒泡/插入排序更快。查看各种计数/基数排序以开始。
-
我投票结束这个问题,因为它属于codereview.stackexchange.com