谁能告诉我为啥这超过了 2 秒的时间限制?(短代码)

Posted

技术标签:

【中文标题】谁能告诉我为啥这超过了 2 秒的时间限制?(短代码)【英文标题】:Can anyone tell me why does this exceed the time limit of 2 seconds ?(short code)谁能告诉我为什么这超过了 2 秒的时间限制?(短代码) 【发布时间】:2017-04-04 12:38:38 【问题描述】:

我已经为此苦苦挣扎了 2 天。请问,当我使用 20000 和 0 和 40000 之后的数字作为输入时,为什么它会超过时间限制?我试图使变量类型尽可能大,但这似乎也无济于事。

#include <bits/stdc++.h>

using namespace std;

int main()

    /*freopen("file.in", "r", stdin);
    freopen("file.out", "w" , stdout);*/
    long long int aux,i, n, k, j, total = 0;
    cin >> n >> k;
    long long int a[n], b[n], order[n];
    signed long long int profit[n];
    for(i = 0; i < n; i++)
        cin >> a[i];
    for(i = 0; i < n; i++)
        cin >> b[i];
    for(i = 0; i < n; i++)
        profit[i] = a[i] - b[i];
    for(i = 0; i < n; i++)
        order[i] = i;
    for(i = 0; i < n; i++)
        for(j = i + 1; j < n; j++)
            if(profit[order[i]] > profit[order[j]])
            
                aux = order[i];
                order[i] = order[j];
                order[j] = aux;
            
    if(k > 0)
        for(i = 0; i < k; i++)
        
            total += a[order[i]];
        

    for(i = k; i < n; i++)
    
        if(profit[order[i]] < 0)
            total += a[order[i]];
        else
            total += b[order[i]];
    
    cout << total;

    return 0;

【问题讨论】:

您是否分析过您的代码以确定它实际花费的时间? 我该怎么做? 您可以从这里开始阅读:***.com/questions/2229336/linux-application-profiling 和#include &lt;bits/stdc++.h&gt;?!?!?不就是不。不要那样做。见***.com/questions/31816095/… 感谢您让我知道第二个链接 :)。你是个英雄 但我对第一个链接一无所知。请问您在我的代码中进行必要的排序方法替换。我在乞讨,如果代码是在我的上下文中编写的,那么理解代码会容易得多。请:,( 初学者遇到的最大问题是知道在哪里寻找答案。当你使用像#include &lt;bits/stdc++.h&gt; 这样的快捷方式时——除了链接中的问题——你不会学习如何正确使用东西。例如,如果要使用 C++ vector,则需要 #include 正确的标头。如果您想使用 C 风格的基于系统调用的 IO,例如 open()/read()/write() - 您必须学习如何识别正确的标头。例如,要使用 C open() 系统调用,您可以使用 man open 命令查看 open 的手册页。 【参考方案1】:

您的代码复杂度为 O(n^2),对于 N=20000 来说太过分了。降低复杂性,用 Qsort 代替冒泡排序。试试std::sort的自定义比较功能。

【讨论】:

如何使用 std:sort ?我不熟悉它。而且快速排序也没有性能 O(n^2) 的最坏情况? 这取决于实现。当您选择需要 O(n log n) 的随机枢轴元素时。如果你愿意,你可以使用归并排序或复杂度为 O(log n) 的任何排序

以上是关于谁能告诉我为啥这超过了 2 秒的时间限制?(短代码)的主要内容,如果未能解决你的问题,请参考以下文章

谁能告诉我为啥我从 GitLab 收到此“错误:作业失败:退出代码 1”消息?

开发服务器返回响应错误代码:500 react-native 为啥这个错误谁能告诉我

我正在尝试从 .csv 读取信息并将其放入 C# 中的数组中。谁能告诉我为啥代码不起作用?

谁能告诉为啥以下两个代码之间的结果不同? [复制]

谁能告诉我为啥我的过滤数组是空的?

谁能告诉为啥在使用 StreamWriter 保存数据时仍然显示以前的数据