codeforce 超过了时间限制

时间:2021-04-02 08:38:23

标签: c++ c++11

我已经被这个 problem 困住了很长时间。当我提交代码时,我总是得到“超出时间限制”。 我的解决方案是输入数组的项,然后确定数组中的最大数并将其与后面的元素一起显示,依此类推。 如何让我的算法更高效?

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int T, n;
    cin >> T;
    while (T--) {
        //inputting p[n]
        scanf_s("%d", &n);
        int* p = new int[n];
        for (int i = 0; i < n; i++) {
            scanf_s("%d", &p[i]);
        }

        while (n != 0) {
            //*itr = largest element in the array
            auto itr = find(p, p + n, *max_element(p, p + n));
            int index = distance(p, itr);

            for (int i = index; i < n; i++) {
                printf("%d\n", p[i]);
            }
            //deleting element by decreasing n:
            n = index;
        }

        delete[] p;
    }
    return 0;
}

1 个答案:

答案 0 :(得分:0)

你的解决方案是 O(n^2),太慢了。

通过迭代计算最大元素的位置直到给定索引 i 获得 O(n) 解决方案。

#include <iostream>
#include <vector>
#include <algorithm>
//using namespace std;

int main() {
    int T;
    std::cin >> T;
    while (T--) {
        //inputting p[n]
        int n;
        std::cin >> n;
        std::vector<int> p(n);
        for (int i = 0; i < n; i++) {
            std::cin >> p[i];
        }
        std::vector<int> max_before(n);
        max_before[0] = 0;
        for (int i = 1; i < n; ++i) {
            if (p[i] > p[max_before[i-1]]) {
                max_before[i] = i;
            } else {
                max_before[i] = max_before[i-1];
            }
        }

        while (n != 0) {
            int index = max_before[n-1];
            for (int i = index; i < n; i++) {
                std::cout << p[i] << " ";
            }
            //deleting element by decreasing n:
            n = index;
        }
        std::cout << '\n';
    }
    return 0;
}
相关问题