c语言表达式求值的空间复杂度,373-时间复杂度(表达式求值)
题目链接: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-时间复杂度(表达式求值)相关推荐
- 二进制补码求值用c语言,C语言程序设计第2章数据类型.运算符与表达式.ppt
C语言程序设计第2章数据类型.运算符与表达式 教学目标 掌握C语言标识符的组成 理解C语言的基本数据类型 掌握变量定义的方法 掌握常用的运算符的使用 掌握混合运算的数据转换方法 2.1 C语言的数据类 ...
- C/C++求值顺序点和 副作用表达式讲解
广州达内作为达内集团60多家培训中的一个,已成为了广州IT培训的领头羊,通过标准化的培训,让实战少的学生完美蜕变成为软件开发职场精英人才,成功帮助学员收获名企offer.(转载于:http://www ...
- C语言程序设计:这里输入一个数,分别求其平方值、立方值和平方根。
C语言程序设计: 这里输入一个数,分别求其平方值.立方值和平方根. 求平方值时可以直接调用数学函数Math.sqrt() #include <stdio.h> #include <m ...
- 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的网友咨询 浏 ...
- 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 ...
- c语言求平均数double,编写程序以计算浮点值的平均值
定义一个函数,用于计算任意数量的浮点值的平均值.double类型值的数组在数组参数中传递给函数.读取从键盘输入的任意数量的值并输出平均值. 实现代码 #define __STDC_WANT_LIB_E ...
- c语言程序设计运算符及表达式,c语言程序设计3第3章运算符和表达式
1.第3章 运算符和表达式,3.1 表 达 式 3.2 运算符及表达式 3.3 运算符优先级和结合性,3.1 表 达 式,C语言的表达式分为基本表达式和复杂表达式. 基本表达式是由以下单项构成的,即: ...
- c语言程序设计运算符及表达式,C语言程序设计3第3章运算符和表达式.ppt
退出退出 第3章 运算符和表达式 3.1 表 达 式 3.2 运算符及表达式 3.3 运算符优先级和结合性 3.1 表 达 式 C语言的表达式分为基本表达式和复杂表达式. 基本表达式是由以下单项构成的 ...
- c语言宏函数返回值,C++宏定义方法的返回值
这个人呐,面个试都会紧张,一紧张就忘东西...哎 其实究其原因在于自己对知识了解没有深入到一定程度(自己:怪我咯). 起因 今天被问到使用C++语言中的宏来求一年的秒数. 分析问题,其实秒数很容易计算 ...
- c语言程序计算p q真值表,C语言程序设计第2章数据类型﹒运算符和表达式.ppt
C语言程序设计第2章数据类型﹒运算符和表达式 教学目标 掌握C语言标识符的组成 理解C语言的基本数据类型 掌握变量定义的方法 掌握常用的运算符的使用 掌握混合运算的数据转换方法 2.1 C语言的数据类 ...
最新文章
- 求 1~n 之间素数的个数
- ReactNative windows下打包生成安卓apk
- 【2015沈阳现场A】
- AndroidStudio报错:GradleSyncIssues-Could not install Gradle distribution from...
- Debug Tensorflow :Two checkpoint references resolved to different objects
- [MyBatisPlus]Plus分页插件的配置和使用
- 城市APP集成Firebase/Admob/增强现实带PHP管理后台
- Scala-列表操作
- VMware Workstation 12 Player之安装林耐斯-Linux Red Hat 7 -系统
- 巴什博弈:取石子游戏
- 成品app直播源码,Android自屏幕底部滑出更多面板的实现
- 苹果手机桌面找不到计算机,苹果手机设置图标不见了怎么办
- python爬app西瓜视频_python3 scrapy抓取今日头条视频(西瓜视频)
- 基于企业战略的业务流程重组与外包(2) (转载)
- 抖音的广告位在哪?抖音信息流广告样式?
- 这家公司,打造电竞三冠王SKT,无视法律,韩国总统还得给他赔笑脸
- LINUX软中断-softirq
- JavaWeb(4)JavaScript高级
- QGIS常用图源(谷歌中国、mapbox、esri、天地图等)(weixin公众号【图说GIS】)
- 对java中public、static的理解
热门文章
- 什么叫做项目孵化_什么叫创业孵化服务?
- java 64内存不足_window7 64bit解决tomcat内存不足问题
- python中xpath如何获取内容_python requests + xpath 获取分页详情页数据存入到txt文件中...
- rand函数怎么避免重复_Excel常用的计算统计函数
- 【TensorFlow-windows】(三) 多层感知器进行手写数字识别(mnist)
- Tomcat启动乱码及IDEA中tomcat信息乱码解决方法
- #CSP 201912-2 回收站选址(C语言)(100分)
- 在LaTeX中,如何在目录和章节(Chapter)等部分的shouye上显示页眉(解决没有页眉的问题)
- 粤嵌GE6818实现识别触摸坐标的识别
- html5中的FileReader对象