时间复杂度

时间复杂度

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 3
描述

ACM里面,计算复杂度是一项非常重要的事情,常见的复杂度格式有三种:

  1. O(n)
    O(lg(n))
    O(sqrt(n))

一个算法往往有多种解法,每种解法的复杂度有上述常见的的复杂度组合成,例如排序的两种算法:

  1. 快速排序: 时间复杂度为O(n*lg(n))

  2. 冒泡排序: 时间复杂度为O(n*n)

现在给定你一个nm个算法复杂度,请确定这些复杂度是否会超时。若复杂度计算结果大于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;
}
        



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值