谁能告诉我为啥这超过了 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 <bits/stdc++.h>
?!?!?不就是不。不要那样做。见***.com/questions/31816095/…
感谢您让我知道第二个链接 :)。你是个英雄 但我对第一个链接一无所知。请问您在我的代码中进行必要的排序方法替换。我在乞讨,如果代码是在我的上下文中编写的,那么理解代码会容易得多。请:,(
初学者遇到的最大问题是知道在哪里寻找答案。当你使用像#include <bits/stdc++.h>
这样的快捷方式时——除了链接中的问题——你不会学习如何正确使用东西。例如,如果要使用 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 为啥这个错误谁能告诉我