码迷,mamicode.com
首页 > 其他好文 > 详细

时间复杂度

时间:2017-08-13 15:19:34      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:lis   val   语言   std   关于   算法复杂度   bottom   break   fine   

时间复杂度

时间限制: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;
}
        



时间复杂度

标签:lis   val   语言   std   关于   算法复杂度   bottom   break   fine   

原文地址:http://www.cnblogs.com/clnchanpin/p/7353432.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!