时间复杂度的估算

在数据结构里面,时间复杂度是决定算法效率的一项重要指标,常见的时间复杂度格式有三种:
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 (1n10000000), m(1m100), 其中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;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值