时间复杂度
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描写叙述
-
在ACM里面,计算复杂度是一项很重要的事情,常见的复杂度格式有三种:
-
O(n)
O(lg(n))
O(sqrt(n))
一个算法往往有多种解法,每种解法的复杂度有上述常见的的复杂度组合成。比如排序的两种算法:
-
高速排序: 时间复杂度为O(n*lg(n))
-
冒泡排序: 时间复杂度为O(n*n)
如今给定你一个n,m个算法复杂度,请确定这些复杂度是否会超时。
若复杂度计算结果大于100000000。则为超时(TLE),否则输出计算的复杂度。输出的结果保留两位小数。
( lg(n)表示以2为底数。n为真数的值)
-
输入
-
第一行输入n (1≤n≤10000), m(1≤m≤100), 当中n为题目描写叙述的数,m为算法复杂度的个数。
接下来m行,每行为一个串,每一个串都包括O()不论什么括号中面的数据保证仅由n,lg(),sqrt(),*组成而且合法。如sample input所看到的。
输出
- 对于每一个串。若计算出来的复杂度大于100000000,则输出TLE,否则输出该复杂度的计算次数 例子输入
-
10000 6 O(n*n) O(n*n*n) O(sqrt(n)) O(lg(n)) O(n*lg(n)) O(n*lg(n*lg(n)))
例子输出
-
100000000.00 TLE 100.00 13.29 132877.12 170197.33
提示
-
关于lg(n)的C语言代码能够这样写
log(n) / log(2)
-
-
代码:
-
#include<stdio.h> #include<string.h> #include<math.h> #define N 100000000 char stack[1005]; int k,n; double eval() { if(k<0) return 0; if(stack[k]=='n') { k--; return n; } if(stack[k]=='*') { k--; return eval()*eval(); } if(stack[k]=='g') { k--; return log(eval())/log(2); } if(stack[k]=='t') { k--; return sqrt(eval()); } } int main() { int m,i,j,top,len,s; double result; char str[1005],ch[1005]; while(~scanf("%d%d",&n,&m)) { for(i=1;i<=m;i++) { scanf("%s",str); top=-1; s=-1; len=strlen(str); for(j=len-1;j>=1;j--) { if(str[j]=='n') { top++; stack[top]=str[j]; } if(j<1) break; if(str[j]==')'||str[j]=='*') { s++; ch[s]=str[j]; } else if(str[j]=='(') { while(s>=0&&ch[s]!=')') { top++; stack[top]=ch[s]; s--; } s--; } else if(str[j]=='t') { top++; stack[top]=str[j]; j=j-3; } else if(str[j]=='g') { top++; stack[top]=str[j]; j=j-1; } } while(s>=0) { if(ch[s]!=')') { top++; stack[top]=ch[s]; s--; } } top++; stack[top]='\0'; k=strlen(stack)-1; result=eval(); if(result>N) printf("TLE\n"); else printf("%.2f\n",result); } } return 0; }
-
-