微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

codeforce 超过了时间限制

如何解决codeforce 超过了时间限制

我已经被这个 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;
}

解决方法

你的解决方案是 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;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。