在数据结构里面,时间复杂度是决定算法效率的一项重要指标,常见的时间复杂度格式有三种:
1、O(n)
2、O(lg(n))
3、O(sqrt(n))
一个算法往往有多种解法,每种解法的复杂度由上述常见的的复杂度组合成,例如排序的两种算法:
1、 快速排序:时间复杂度为O(n*lg(n))
2、冒泡排序:时间复杂度为O(n*n)
现在先给定n的值,然后输入一个值m,随后输入m行数据表示有m个算法的复杂度。请确定这些复杂度是否会超时。若复杂度计算结果大于100000000,则为超时(TLE),否则输出计算的复杂度,输出的结果保留两位小数。
( lg(n)表示求以2为底数的n的对数 )
输入
第一行输入n (1≤n≤10000000), m(1≤m≤100), 其中n为表示问题规模的数,m为算法复杂度的个数。
接下来m行,每行为一个串,每个串都包含O( ),其中,字符'O'后的括号里面的字符串保证仅由n,lg(n),sqrt(n),*组成并且合法。如sample input所示。
注意:lg()或sqrt()中只会出现字符'n',不会再嵌套lg()或sqrt()。如果想做得难一点,可以去做编号为1049的题,1049题要考虑嵌套。
输出
对于每个串,若计算出来的复杂度大于100000000,则输出TLE,否则输出该复杂度的计算结果。
样例输入
10000 5 O(n*n) O(n*n*n) O(sqrt(n)) O(lg(n)) O(n*lg(n))
样例输出
100000000.00 TLE 100.00 13.29 132877.12
#include<stdio.h> #include<math.h> #include<string.h> int main() { int i,j,n, m,e, f,g; double a,b,c,sum; char d[10000]; while (scanf("%d",&n)!=EOF) { scanf("%d", &m); a = log10(n*1.0)/log10(2.0); // 用lg(n) b = sqrt(n*1.0); // 用sqrt(n) c = n; while (m--) { // O(n) n scanf("%s",d); // O(lg(n)) a //O(sqrt(n)) b e = strlen(d); sum = 1; for (i = 0; i < e; i++) { if (d[i] == 's'&&d[i+1] == 'q'&&d[i+2] == 'r'&&d[i+3] == 't'&&d[i+4] == '('&&d[i+5] == 'n'&&d[i+6] == ')') { sum = sum*b; i = i + 6; } else if (d[i] == 'l'&&d[i+1] == 'g'&&d[i+2] == '('&&d[i+3] == 'n'&&d[i+4] == ')') { sum = sum*a; i = i + 4; } else if (d[i] == 'n') { sum = sum*n; } } if (sum>100000000) { printf("TLE\n"); } else { printf("%0.2lf\n",sum); } } } return 0; }