标签: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