题目链接:373-时间复杂度

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

O(n)

O(lg(n))

O(sqrt(n))

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

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

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

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

#include

#include

#include

using namespace std;

const int maxn=1000000;

char a[maxn];

double n;

int t;

double dfs(int l,int r)

{

double ans=1;

for(int i=l; i<=r; i++)

{

if(a[i]=='n')

ans*=n;

else if(a[i]=='l')

{

i+=3;

int e,f1=1;

for(int j=i; f1; j++)

{

if(a[j]==')')

f1--;

if(a[j]=='(')

f1++;

if(f1==0)

{

e=j;

break;

}

}

double f=dfs(i,e-1);//递归

ans*=log(f)/log(2.0);

i=e;

}

else if(a[i]=='s')

{

i+=5;

int e,f1=1;

for(int j=i; f1; j++)

{

if(a[j]==')')

f1--;

if(a[j]=='(')

f1++;

if(f1==0)

{

e=j;

break;

}

}

double f=dfs(i,e-1);//递归

ans*=sqrt(f);

i=e;

}

}

return ans;

}

int main()

{

int g;

while(~scanf("%lf%d",&n,&t))

{

while(t--)

{

scanf("%s",a);

int la=strlen(a);

double f=dfs(2,la-2);//一直递归括号里的东西

if(f>100000000.0)

printf("TLE\n");

else printf("%.2lf\n",f);

}

}

return 0;

}

第二种是用python写的:

import math

def lg(n):

return math.log2(n)

def sqrt(n):

return math.sqrt(n)

def O(n):

return eval(str(n))

n,m=map(int,input().split())

for case in range(m):

s=input()

ans=eval(str(s))

if ans>100000000:

print('TLE')

else:

print('%.2f' % ans)

第三种是模拟:

#include

#include

#include

#include

#include

using namespace std;

int n,m;

string s;

string sta_c[10000];

double num[10000];

int top_c,top_n,len;

int main()

{

scanf("%d%d",&n,&m);

while(m--)

{

memset(num,0,sizeof(num));

top_c=top_n=0;

cin>>s;

len=s.size();

for(int i=0; i<=len; i++)

sta_c[i]="";

for(int i=2; i1; i++)

{

if(s[i]=='n')

num[++top_n]=n;

else if(s[i]=='(') sta_c[++top_c]="(";

else if(s[i]=='l') sta_c[++top_c]="lg";

else if(s[i]=='s') sta_c[++top_c]="sqrt";

else if(s[i]=='*') sta_c[++top_c]="*";

else if(s[i]==')')

{

while(sta_c[top_c]!="(")

{

if(sta_c[top_c]=="*")

{

num[top_n-1]=num[top_n]*num[top_n-1];

top_n--;

}

top_c--;

}

if(sta_c[top_c]=="(")

{

top_c--;

if(sta_c[top_c]=="lg")

{

num[top_n]=log(num[top_n])/log(2);

top_c--;

}

else if(sta_c[top_c]=="sqrt")

{

num[top_n]=sqrt(num[top_n]);

top_c--;

}

}

}

}

while(top_n!=1)

{

num[top_n-1]=num[top_n-1]*num[top_n];

top_n--;

}

if(num[1]>100000000)

printf("TLE\n");

else

{

printf("%.2lf\n",num[1]);

}

}

}

c语言表达式求值的空间复杂度,373-时间复杂度(表达式求值)相关推荐

  1. 二进制补码求值用c语言,C语言程序设计第2章数据类型.运算符与表达式.ppt

    C语言程序设计第2章数据类型.运算符与表达式 教学目标 掌握C语言标识符的组成 理解C语言的基本数据类型 掌握变量定义的方法 掌握常用的运算符的使用 掌握混合运算的数据转换方法 2.1 C语言的数据类 ...

  2. C/C++求值顺序点和 副作用表达式讲解

    广州达内作为达内集团60多家培训中的一个,已成为了广州IT培训的领头羊,通过标准化的培训,让实战少的学生完美蜕变成为软件开发职场精英人才,成功帮助学员收获名企offer.(转载于:http://www ...

  3. C语言程序设计:这里输入一个数,分别求其平方值、立方值和平方根。

    C语言程序设计: 这里输入一个数,分别求其平方值.立方值和平方根. 求平方值时可以直接调用数学函数Math.sqrt() #include <stdio.h> #include <m ...

  4. c语言分母多项乘积怎么算,C++编程 用梯形求积公式求解定积分∫3lnxdx积分区间为(1,2, C语言,用梯形法编程求定积分x^3+x/2+1的值...

    问题标题 C++编程 用梯形求积公式求解定积分∫3lnxdx积分区间为(1,2, C语言,用梯形法编程求定积分x^3+x/2+1的值 2019-8-16来自ip:15.179.13.64的网友咨询 浏 ...

  5. C语言学习之求S=a+aa+aaa+... +aa.....aa之值,其中a是一个数字,n表示a的位数.

    求S=a+aa+aaa+- +aa-aa之值,其中a是一个数字,n表示a的位数. 例如:2+22+222+2222 +22222(此时n=5),n由键盘输入. #include <stdio.h ...

  6. c语言求平均数double,编写程序以计算浮点值的平均值

    定义一个函数,用于计算任意数量的浮点值的平均值.double类型值的数组在数组参数中传递给函数.读取从键盘输入的任意数量的值并输出平均值. 实现代码 #define __STDC_WANT_LIB_E ...

  7. c语言程序设计运算符及表达式,c语言程序设计3第3章运算符和表达式

    1.第3章 运算符和表达式,3.1 表 达 式 3.2 运算符及表达式 3.3 运算符优先级和结合性,3.1 表 达 式,C语言的表达式分为基本表达式和复杂表达式. 基本表达式是由以下单项构成的,即: ...

  8. c语言程序设计运算符及表达式,C语言程序设计3第3章运算符和表达式.ppt

    退出退出 第3章 运算符和表达式 3.1 表 达 式 3.2 运算符及表达式 3.3 运算符优先级和结合性 3.1 表 达 式 C语言的表达式分为基本表达式和复杂表达式. 基本表达式是由以下单项构成的 ...

  9. c语言宏函数返回值,C++宏定义方法的返回值

    这个人呐,面个试都会紧张,一紧张就忘东西...哎 其实究其原因在于自己对知识了解没有深入到一定程度(自己:怪我咯). 起因 今天被问到使用C++语言中的宏来求一年的秒数. 分析问题,其实秒数很容易计算 ...

  10. c语言程序计算p q真值表,C语言程序设计第2章数据类型﹒运算符和表达式.ppt

    C语言程序设计第2章数据类型﹒运算符和表达式 教学目标 掌握C语言标识符的组成 理解C语言的基本数据类型 掌握变量定义的方法 掌握常用的运算符的使用 掌握混合运算的数据转换方法 2.1 C语言的数据类 ...

最新文章

  1. 求 1~n 之间素数的个数
  2. ReactNative windows下打包生成安卓apk
  3. 【2015沈阳现场A】
  4. AndroidStudio报错:GradleSyncIssues-Could not install Gradle distribution from...
  5. Debug Tensorflow :Two checkpoint references resolved to different objects
  6. [MyBatisPlus]Plus分页插件的配置和使用
  7. 城市APP集成Firebase/Admob/增强现实带PHP管理后台
  8. Scala-列表操作
  9. VMware Workstation 12 Player之安装林耐斯-Linux Red Hat 7 -系统
  10. 巴什博弈:取石子游戏
  11. 成品app直播源码,Android自屏幕底部滑出更多面板的实现
  12. 苹果手机桌面找不到计算机,苹果手机设置图标不见了怎么办
  13. python爬app西瓜视频_python3 scrapy抓取今日头条视频(西瓜视频)
  14. 基于企业战略的业务流程重组与外包(2) (转载)
  15. 抖音的广告位在哪?抖音信息流广告样式?
  16. 这家公司,打造电竞三冠王SKT,无视法律,韩国总统还得给他赔笑脸
  17. LINUX软中断-softirq
  18. JavaWeb(4)JavaScript高级
  19. QGIS常用图源(谷歌中国、mapbox、esri、天地图等)(weixin公众号【图说GIS】)
  20. 对java中public、static的理解

热门文章

  1. 什么叫做项目孵化_什么叫创业孵化服务?
  2. java 64内存不足_window7 64bit解决tomcat内存不足问题
  3. python中xpath如何获取内容_python requests + xpath 获取分页详情页数据存入到txt文件中...
  4. rand函数怎么避免重复_Excel常用的计算统计函数
  5. 【TensorFlow-windows】(三) 多层感知器进行手写数字识别(mnist)
  6. Tomcat启动乱码及IDEA中tomcat信息乱码解决方法
  7. #CSP 201912-2 回收站选址(C语言)(100分)
  8. 在LaTeX中,如何在目录和章节(Chapter)等部分的shouye上显示页眉(解决没有页眉的问题)
  9. 粤嵌GE6818实现识别触摸坐标的识别
  10. html5中的FileReader对象