oj对算法的时间复杂度
程序性能分析👇👇👇
https://blog.csdn.net/qq_41523096/article/details/82142747
具体的计算👇👇👇
https://blog.csdn.net/daijin888888/article/details/66970902?utm_source=app
上面两部分了解了之后,就是接下来的内容:(其实也就是,兄弟,该优化算法了)
在竞赛中,一般算机一秒能运行5 x 10^8次汁算,如果题目給出的时间限制カ1s,那么你选择的算法执行的汁算次数最多应该在10^8量级オ有可能解决这个题目。一般 O(n)的算法能解决的数据范围在n < 10^8。
O(n *logn)的算法能解决的数据范围在n <= 10^6。
O(n*sqrt(n) )的算法能解决的数据范围在n < 10^5。
O(n^2)的算法能解决的数据范围在n<5000。
O(n^3)的算法能解决的数据范围在n <300。
O(2^n)的算法能解决的数据范围在n < 25。
O(n!)的算法能解决的数据范围在n < 11。
以上范围仅供参考,实际中还要考虑每种算法的常数。
贴一道小依的期末考试题:
如果1s的时限给数据范围是10的7或8次方的话一般只能用O(n)的算法
对于上面的题,10的9次方10组数据,也就是10的10次方的时间,这样子1s是不可行的
贴上当时的代码:
#include<iostream> using namespace std; const int max1 = 1000000; const int max2 = 1000000000; const int max3 = 10; void Yoriko(int &a, int &b, int &c, int &k) { int i; for (i = 0; i < k; i++) { if(a==b&&b==c) break; if (a > b) a = a - b; if (b > c) b = b - c; if (c > a)c = c - a; } } int main() { int t; int a, b, c, k; int i; int str[max3][3]; cin >> t; for (i = 0; i < t; i++) { cin >> a >> b >> c >> k; Yoriko(a,b,c,k); str[i][0] = a; str[i][1] = b; str[i][2] = c; } for (i = 0; i < t; i++) { cout << str[i][0] << " " << str[i][1] << " " << str[i][2] << endl; } }
加break的话因为abc的范围都是10的6次,1秒就够了。
其他地方有不对不详的地方还请纠正,欢迎相互交流侬。