P3952 时间复杂度
题目描述
小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会来啦!下面请你编写程序来判断小明对他的每个程序给出的时间复杂度是否正确。
A++语言的循环结构如下:
F i x y
循环体
E其中
F i x y表示新建变量 ii(变量 ii 不可与未被销毁的变量重名)并初始化为 xx, 然后判断 ii和 yy 的大小关系,若 ii 小于等于 yy 则进入循环,否则不进入。每次循环结束后 ii 都会被修改成 i +1i+1,一旦 ii 大于 yy 终止循环。xx 和 yy 可以是正整数(xx 和 yy 的大小关系不定)或变量 nn。nn 是一个表示数据规模的变量,在时间复杂度计算中需保留该变量而不能将其视为常数,该数远大于 100100。
“E”表示循环体结束。循环体结束时,这个循环体新建的变量也被销毁。
注:本题中为了书写方便,在描述复杂度时,使用大写英文字母“O”表示通常意义下“Θ”的概念。
输入输出格式
输入格式:
输入文件第一行一个正整数 t,表示有 t(t<=10)个程序需要计算时间复杂度。 每个程序我们只需抽取其中
F i x y和E即可计算时间复杂度。注意:循环结构 允许嵌套。接下来每个程序的第一行包含一个正整数 LL 和一个字符串,LL 代表程序行数,字符 串表示这个程序的复杂度,
O(1)表示常数复杂度,O(n^w)表示复杂度为n^w,其 中w是一个小于100的正整数(输入中不包含引号),输入保证复杂度只有O(1)和O(n^w)两种类型。接下来 L 行代表程序中循环结构中的
F i x y或者E。 程序行若以F开头,表示进入一个循环,之后有空格分离的三个字符(串)i x y, 其中 ii 是一个小写字母(保证不为n),表示新建的变量名,x 和 y 可能是正整数或 nn ,已知若为正整数则一定小于 100。程序行若以
E开头,则表示循环体结束。输出格式:
输出文件共 t行,对应输入的 t 个程序,每行输出
Yes或No或者ERR(输出中不包含引号),若程序实际复杂度与输入给出的复杂度一致则输出Yes,不一致则输出No,若程序有语法错误(其中语法错误只有: ① F 和 E 不匹配 ②新建的变量与已经存在但未被销毁的变量重复两种情况),则输出ERR。注意:即使在程序不会执行的循环体中出现了语法错误也会编译错误,要输出
ERR。输入输出样例
输入样例#1:8
2 O(1)
F i 1 1
E
2 O(n^1)
F x 1 n
E
1 O(1)
F x 1 n
4 O(n^2)
F x 5 n
F y 10 n
E
E
4 O(n^2)
F x 9 n
E
F y 2 n
E
4 O(n^1)
F x 9 n
F y n 4
E
E
4 O(1)
F y n 4
F x 9 n
E
E
4 O(n^2)
F x 1 n
F x 1 10
E
E输出样例#1:Yes
Yes
ERR
Yes
No
Yes
Yes
ERR说明
【输入输出样例解释1】
第一个程序 i从 1 到 1 是常数复杂度。
第二个程序 x 从 1 到 n 是 n 的一次方的复杂度。
第三个程序有一个
F开启循环却没有E结束,语法错误。第四个程序二重循环,n 的平方的复杂度。
第五个程序两个一重循环,n 的一次方的复杂度。
第六个程序第一重循环正常,但第二重循环开始即终止(因为n远大于100,100大于4)。
第七个程序第一重循环无法进入,故为常数复杂度。
第八个程序第二重循环中的变量 x 与第一重循环中的变量重复,出现语法错误②,输出
ERR。【数据规模与约定】
对于 %30%的数据:不存在语法错误,数据保证小明给出的每个程序的前 L/2 行一定为以
F开头的语句,第 L/2+1 行至第 L 行一定为以 E开头的语句,L≤10,若 x、y 均 为整数,x 一定小于 y,且只有 yy 有可能为 nn。对于 50%的数据:不存在语法错误,L <=100,且若 x、y 均为整数,x 一定小于 y, 且只有 y有可能为 n。
对于 70%的数据:不存在语法错误,L≤100。
对于 100%的数据:L≤100。
思路:
直接用getline(cin,str)一行一行读,写一个get_num获取其中的数字,将'n'视为一个极大的数
- 用一个栈模拟存变量,ins标记是否被定义过,用来判ERR,used表示该变量对复杂度是否有贡献,用flag来维护最早的不能进入循环的变量(如for int i=3 ; i<=1 ; i++),因为在它之后的根本不能运行,初始化为-1,出栈时判一下如果flag=k,则其后面的语句又可以正常运行了,令flag=-1.
代码
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cctype>
#include <cmath>
#include <stack>
using namespace std; #define res register int
int T,n;
stack <int> s;
bool ins[],used[];//是否在栈中,对时间复杂度是否有贡献
string o,code[]; template <typename T>
inline T my_max(T a,T b) {return a>b?a:b;}
template <typename T>
inline T my_min(T a,T b) {return a<b?a:b;} inline int get_num(int &x,string c)
{
int tmp(),len=c.size();
while(!isdigit(c[x]) && x<len)
{
if(c[x]=='n') {++x; return ;}
++x;
}
while(isdigit(c[x])) {
tmp=tmp*+c[x]-'';
x++;
}
return tmp;
} inline int get_o()
{
int tmp(),x=;
if(o[]=='n') tmp=get_num(x,o);
else tmp=;//O(1)对应0
return tmp;
} inline int check()
{
int now(),cp();//complexity
int a,b,x;
while(s.size()) s.pop();
memset(ins,,sizeof(ins));
memset(used,,sizeof(used));
int flag(-);
for(res i= ; i<=n ; i++)
{
if(code[i][]=='F')
{
int k=code[i][]-'a';
if(ins[k]) return -;
ins[k]=true; s.push(k);
x=;
a=get_num(x,code[i]);
b=get_num(x,code[i]);
//flag为最早的不能循环的对应的变量k,可以正常循环时为-1
if(b-a> && flag==-)
{
used[k]=true; now++;
cp=my_max(cp,now);
}
else if(a>b && flag==-)
flag=k;
}
else
if(code[i][]=='E')
{
if(s.empty()) return -;
int k=s.top();
s.pop(); ins[k]=false;
if(flag==k) flag=-;
if(used[k]) now--,used[k]=false;
}
}
if(s.size()) return -;
return cp;
} int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d ",&n);
getline(cin,o);
int x0=get_o();
for(res i= ; i<=n ; i++)
getline(cin,code[i]);
int x1=check();
if(x1==-) puts("ERR");
else
{
if(x0==x1) puts("Yes");
else puts("No");
}
}
// system("pause");
return ;
}
P3952 时间复杂度的更多相关文章
- luogu P3952 时间复杂度 模拟
题目链接 luogu P3952 时间复杂度 题解 直接模拟即可 注意不要直接return 我真是naive ...... 代码 #include<map> #include<sta ...
- 洛谷 P3952 时间复杂度 解题报告
P3952 时间复杂度 题目描述 小明正在学习一种新的编程语言A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会 ...
- 洛谷P3952 时间复杂度【字符串】【模拟】
题目描述 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会来啦!下面请你编写程序 ...
- 【luogu P3952 时间复杂度】 题解
对于2017 D1 T2 这道题 实实在在是个码力题,非常考验耐心. 其实大体的思路并不是非常难想出来,但是要注意的小细节比较多. 题目链接:https://www.luogu.org/problem ...
- 洛谷 - P3952 - 时间复杂度 - 模拟
https://www.luogu.org/problemnew/show/P3952 这个模拟,注意每次进入循环的时候把新状态全部入栈,退出循环的时候就退栈. 第一次就错在发现ERR退出太及时,把剩 ...
- 洛谷P3952 时间复杂度
大毒瘤...... 时隔快半年我终于花了两个小时堪堪A掉这一题...果然我还没有准备好. 想法:用DFS模拟递归. 时间复杂度的处理:每层循环取max,然后相加. 最大难点:各种繁杂而令人发指的特判. ...
- LOJ P3952 时间复杂度 noip 暴力 模拟
https://www.luogu.org/problemnew/show/P3952 模拟,日常认识到自己zz. #include<iostream> #include<cstdi ...
- [LUOGU] P3952 时间复杂度
其实,也没那么难写 这种模拟题,仔细分析一下输入格式,分析可能的情况,把思路写在纸上,逐步求精,注意代码实现 主要思路就是算一个时间复杂度,和给出的复杂度比较,这就先设计一个函数把给出的复杂度由字符串 ...
- 计蒜客 时间复杂度 (模拟) & 洛谷 P3952 时间复杂度
链接 : Here! 思路 : 这是一道大模拟, 区分好情况就没问题了 循环构成部分 : $F , x , i , j$ 和 $E$ , 需要注意的是 $i , j$, - 分析 $i, j$ 的情况 ...
随机推荐
- 【Unity】关于U3d与bip骨骼适配
http://blog.csdn.net/kiki110120/article/details/50371662 写在2015/12/21 1.Generic 在拿到美术FBX文件后,导入u3d,默认 ...
- 从顶端插入,滚动展示(Demo):
新闻滚动,从顶端插入: <!DOCTYPE html> <html> <head> <script src="/jquery/jquery-1.11 ...
- ajax请求后台有时走有时不走
ajax请求后台有时走有时不走 ajax请求后台有时走有时不走,是因为没有将请求设置为同步方式,async:false,(默认为true即异步).如果不想使用缓存可以将cache:false,例如 ...
- 为什么ajax发GET请求就成功,POST请求则报错?
为什么ajax发GET请求就成功,POST请求则报错? (1)首先说明的是请求的URL是一个静态资源,比如一个json文件.(2)现在现象是发GET请求就成功,POST请求则报错.(3)最新发现:就算 ...
- 15-I hate it (HDU1754:线段树)
http://acm.hdu.edu.cn/showproblem.php?pid=1754 相似例题: 敌兵布阵 http://www.cnblogs.com/zhumengdexiao ...
- office excel 2010 破解版下载地址
office excel 2010 破解版下载地址 http://www.xitongzhijia.net/soft/24189.html
- p1429 平面最近点对(加强版)
传送门 分析 我们可以枚举每一个点算它的最近点 估价函数应该分为3种情况计算: 大于max,小于min,位于min和max之间 代码 #include<iostream> #include ...
- array_column()
array_column($arr,value) 返回输入数组中某个单一列的值. array_column($arr,value,key) 返回输入数组中某个单一列的值,value是值,key是键.
- getparameter()和getattribution()的区别的 java详细
两个Web组件之间为转发关系时,转发源会将要共享 request范围内的数据先用setAttribute将数据放入到HttpServletRequest对象中,然后转发目标通过 getAttribut ...
- 白盒测试实践项目(day5)
在这几天的工作下,小组成员都基本完成了各自所负责的内容. 李建文同学完成提交了代码复审相关文档后,也经过小组的补充,彻底完成. 汪鸿同学使用FIndBugs工具完成了静态代码的测试,并且也完成了静态代 ...