标签:lis val 语言 std 关于 算法复杂度 bottom break fine
在ACM里面,计算复杂度是一项很重要的事情,常见的复杂度格式有三种:
O(n)
O(lg(n))
O(sqrt(n))
一个算法往往有多种解法,每种解法的复杂度有上述常见的的复杂度组合成。比如排序的两种算法:
高速排序: 时间复杂度为O(n*lg(n))
冒泡排序: 时间复杂度为O(n*n)
如今给定你一个n,m个算法复杂度,请确定这些复杂度是否会超时。
若复杂度计算结果大于100000000。则为超时(TLE),否则输出计算的复杂度。输出的结果保留两位小数。
( lg(n)表示以2为底数。n为真数的值)
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
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; }
标签:lis val 语言 std 关于 算法复杂度 bottom break fine
原文地址:http://www.cnblogs.com/clnchanpin/p/7353432.html