【题目描述】

小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会来啦!下面请你编写程序来判断小明对他的每个程序给出的时间复杂度是否正确。

A++语言的循环结构如下:

F i x y循环体
E

其中F i x y表示新建变量 i(变量 i 不可与未被销毁的变量重名)并初始化为 x, 然后判断 i 和 y 的大小关系,若 i 小于等于 y 则进入循环,否则不进入。每次循环结束后 i 都会被修改成 i+1,一旦 i 大于 y终止循环。

x 和 y 可以是正整数(x 和 y 的大小关系不定)或变量 n。n 是一个表示数据规模的变量,在时间复杂度计算中需保留该变量而不能将其视为常数,该数远大于 100。

“E”表示循环体结束。循环体结束时,这个循环体新建的变量也被销毁。

注:本题中为了书写方便,在描述复杂度时,使用大写英文字母“O”表示通常意义下“Θ”的概念。

【输入格式】

输入文件第一行一个正整数 t,表示有 t(t≤10)个程序需要计算时间复杂度。 每个程序我们只需抽取其中 F i x yE即可计算时间复杂度。注意:循环结构 允许嵌套。

接下来每个程序的第一行包含一个正整数 L 和一个字符串,L 代表程序行数,字符 串表示这个程序的复杂度,O(1)表示常数复杂度,O(n^w)表示复杂度为n^w,其 中w是一个小于100的正整数(输入中不包含引号),输入保证复杂度只有O(1)O(n^w) 两种类型。

接下来 LL 行代表程序中循环结构中的F i x y或者 E。 程序行若以F开头,表示进入一个循环,之后有空格分离的三个字符(串)i x y, 其中 ii 是一个小写字母(保证不为n),表示新建的变量名,x 和 y 可能是正整数或 n ,已知若为正整数则一定小于 100。

程序行若以E开头,则表示循环体结束。

【输出格式】

输出文件共 t 行,对应输入的 t 个程序,每行输出YesNo或者ERR(输出中不包含引号),若程序实际复杂度与输入给出的复杂度一致则输出Yes,不一致则输出No,若程序有语法错误(其中语法错误只有: ① F 和 E 不匹配 ②新建的变量与已经存在但未被销毁的变量重复两种情况),则输出ERR 。

注意:即使在程序不会执行的循环体中出现了语法错误也会编译错误,要输出 ERR

【输入输出样例】

输入

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

输出

Yes
Yes
ERR
Yes
No
Yes
Yes
ERR

这题花了我近三个小时,本地AC评测就会RE两个点,心累……

这题当然是模拟,但是要考虑的东西很多,所以这题是一道蓝题。

1.首先考虑一下为什么会ERR:

1)有F而没有E

2)有E而没有F

3)变量用过了

看见前两个条件就非常自如的联想到了栈。

bool ok=true;
int word[30];if(word[i-'a'+1]!=0) word[i-'a'+1]=0;
else ok=false;if(p<0) ok=false;//p是指针if(ok==false) {printf("ERR\n");continue;}

2.再考虑一下计算复杂度

1)前为n且后为n -> 复杂度常数级别

2)前为n且后不为n -> 复杂度常数级别

3)前不为n且后为n -> 复杂度n级别

4)前不为n且后不为n -> 复杂度常数级别

5)如果在这条循环之前有一条循环不执行(前不为n且后为n或者说两个常数前面的比后面的大)-> 复杂度常数级别

for(int j=0;j<len;j++)
{if(s[j]>e[j]&&s[j]>='0'&&s[j]<='9'&&e[j]>='0'&&e[j]<='9'){wyq=true;break;}if(s[j]<e[j]&&s[j]>='0'&&s[j]<='9'&&e[j]>='0'&&e[j]<='9') break;
}//若都是常数,进行比较
if(strlen(s)>strlen(e)&&s[0]>='0'&&s[0]<='9'&&e[0]>='0'&&e[0]<='9') h[p+1].lxp=true;
if(wyq||(s[0]=='n'&&e[0]!='n')) h[p+1].lxp=true;//判断代码是否有运行
for(int k=1;k<=p+1;k++)if(h[k].lxp==true) {h[++p].data='1';h[p].old=i;wyc=true;break;}//前面的比后面的大,当作是常数级别
if(wyc) continue;
if(s[0]=='n'&&e[0]=='n') {h[++p].data='1';h[p].old=i;}
if(s[0]=='n'&&e[0]!='n') {h[++p].data='1';h[p].old=i;}
if(s[0]!='n'&&e[0]=='n') {h[++p].data='n';h[p].old=i;}
if(s[0]!='n'&&e[0]!='n') {h[++p].data='1';h[p].old=i;}

3.再然后就是最后的判断和最开始的初始化

感觉没什么问题可还是RE了

上代码

#include<bits/stdc++.h>
using namespace std;
int t,p=0;
struct node{char data;char old;int maxn;//用来储存栈中第i层最大的时间复杂度 bool lxp;//判断代码是否有运行
}h[110];//栈,看是否匹配
int l,word[30];//word是看这个变量用过没有
char o[50];
int num=0,sum=0;
int main()
{
//    freopen("hh1.in","r",stdin);
//    freopen("hh1.out","w",stdout);scanf("%d",&t); while(t--){for(int k=0;k<=109;k++) {h[k].maxn=1;h[k].data=0;h[k].old=0;h[k].lxp=false;}for(int i=0;i<=29;i++) word[i]=1;sum=1;p=0;num=0;//每条程序重置一次 scanf("%d%s",&l,o);bool flag=false;//判断是常数还是n^wbool ok=true;if(strlen(o)==4) flag=true;else {int n=strlen(o);for(int i=0;i<n;i++)if(o[i]<='9'&&o[i]>='0')num=num*10+o[i]-'0';}while(l--){char c,i,s[15],e[15];cin>>c;if(c=='F'){sum=1;//将指数重置 cin>>i>>s>>e; bool wyq=false,wyc=false;//临时变量,不用管意义 int len=strlen(s);for(int j=0;j<len;j++){if(s[j]>e[j]&&s[j]>='0'&&s[j]<='9'&&e[j]>='0'&&e[j]<='9'){wyq=true;break;}if(s[j]<e[j]&&s[j]>='0'&&s[j]<='9'&&e[j]>='0'&&e[j]<='9') break;}//若都是常数,进行比较 if(strlen(s)>strlen(e)&&s[0]>='0'&&s[0]<='9'&&e[0]>='0'&&e[0]<='9') h[p+1].lxp=true;if(wyq||(s[0]=='n'&&e[0]!='n')) h[p+1].lxp=true;//判断代码是否有运行 if(word[i-'a'+1]!=0) word[i-'a'+1]=0;else ok=false;for(int k=1;k<=p+1;k++)if(h[k].lxp==true) {h[++p].data='1';h[p].old=i;wyc=true;break;}//前面的比后面的大,当作是常数级别if(wyc) continue; if(s[0]=='n'&&e[0]=='n') {h[++p].data='1';h[p].old=i;}if(s[0]=='n'&&e[0]!='n') {h[++p].data='1';h[p].old=i;}if(s[0]!='n'&&e[0]=='n') {h[++p].data='n';h[p].old=i;}if(s[0]!='n'&&e[0]!='n') {h[++p].data='1';h[p].old=i;}}if(c=='E'){if(h[p].data==0) p--;if(h[p].data=='n') sum=h[p+1].maxn+1;//前一层为n^1级别的就指数+1else sum=h[p+1].maxn*1;h[p].maxn=max(sum,h[p].maxn);//存储到这时最大的指数 h[p+1].maxn=1;word[h[p].old-'a'+1]=1;h[p].lxp=false;p--;if(p<0) ok=false;}}if(ok==false) {printf("ERR\n");continue;}//如果变量用过了或括号不匹配,错误,跳出去 if(p>0) {printf("ERR\n");continue;}if(flag&&h[1].maxn==1) printf("Yes\n");else if(!flag&&h[1].maxn-1==num) printf("Yes\n");else printf("No\n");}return 0;
}

转载于:https://www.cnblogs.com/fjnhyzcrx-Mayuri/p/11334284.html

洛谷 P3952时间复杂度 (本地AC测评RE的伪题解)相关推荐

  1. 洛谷P3952 时间复杂度【字符串】【模拟】

    题目描述 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会来啦!下面请你编写程序 ...

  2. 计蒜客 时间复杂度 (模拟) 洛谷 P3952 时间复杂度

    链接 : Here! 思路 : 这是一道大模拟, 区分好情况就没问题了 循环构成部分 : $F , x , i , j$ 和 $E$ , 需要注意的是 $i , j$, - 分析 $i, j$ 的情况 ...

  3. 洛谷入门1【顺序结构】题单题解

    目录 超级玛丽 字母转换 数字反转 再分肥皂水 小鱼的游泳时间 小学数学N合1 三角形面积 苹果和虫子 对角线 上学迟到 [入门1]顺序结构 - 题单 - 洛谷 | 计算机科学教育新生态 (luogu ...

  4. 洛谷 P3244 / loj 2115 [HNOI2015] 落忆枫音 题解【拓扑排序】【组合】【逆元】

    组合计数的一道好题.什么非主流题目 题目背景 (背景冗长请到题目页面查看) 题目描述 不妨假设枫叶上有 \(n​\) 个穴位,穴位的编号为 \(1\sim n​\).有若干条有向的脉络连接着这些穴位. ...

  5. 洛谷 P5713、P5719、P5730、P5737题 题解(Java语言描述)

    P5713 题目要求 P5713题目链接 AC代码(Java语言描述) import java.util.Scanner;public class Main {public static void m ...

  6. 大数高精加减乘除(洛谷P1601、P2142、P1303、P1480题题解,Java语言描述)

    写在前面 算法归算法,有现成的API能用为什么不用? (纯算法党别喷我,以后我再写高精算法的文) P1601 → A+B Problem 题目要求 P1601题目链接 AC代码(Java语言描述) i ...

  7. 洛谷 P1217 [USACO1.5]回文质数 Prime Palindromes 题解 C/C++

    知识点: 回文数有两种 一种是单数位数,abcba,一种是双数位数,abccba 而双数位数是质数的只有11,即偶位回文数全不是质数除了11:所以不需要枚举到1亿,到1千万就好了 以下几种方法供参考 ...

  8. 洛谷3384:【模板】树链剖分——题解

    https://www.luogu.org/problemnew/show/P3384 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 ...

  9. 洛谷P5733、P5734、P5735、P5739题题解(Java语言描述)

    P5733题目要求 P5733题目链接 P5733分析 toUpperCase()就行了-- P5733AC代码(Java语言描述) import java.util.Scanner;public c ...

最新文章

  1. javascript 传值给前端(ios 安卓)
  2. Redis-cluster架构
  3. 关于GUI_DOWNLOAD中下载excel等文档的乱码问题
  4. LINUX CP 命令强制覆盖功能开启/关闭
  5. 安装好机器学习环境的虚拟机_虚拟环境之外的数据科学是弄乱机器的好方法
  6. 用css3实现Social Media Buttons
  7. 必背单词_考研英语语法如何高效自学? 真题必背单词Day12
  8. shell学习总结(1-4)
  9. 电脑爱好者 2008年第23期(12月上) PDF
  10. 怎样批量分析安能物流中含有提前签收的单号
  11. HTML5超炫3D雷达扫描地图玩法
  12. C语言基础之十进制与二进制转换
  13. 【python绘图】seaborn(sns)的主题风格
  14. 大数据技术原理与应用之可视化实训
  15. android egl10和egl14
  16. TensorFlow高阶张量叉乘
  17. ios 下拉菜单Menu
  18. echarts柱状图的样式调整及应用
  19. 【蓝牙sbc协议】sbc源码阅读笔记(三)——数据读写过程
  20. 一键分享怎么可以找回删除的照片小技巧

热门文章

  1. java多个类共享的数据_Java---多线程基础总结
  2. python变量类型声明_python变量声明及简单数据类型
  3. 云计算开源软件有哪些?
  4. 动态网页和静态网页的区别是什么?
  5. 前端开发,必知ES5、ES6的7种继承
  6. Web前端基础知识整理
  7. boss 计算机应用,Time Boss(电脑使用时间限制软件)官方版
  8. java 场景处理,最适合使用RxJava处理的四种场景
  9. 四边形内接于圆定理_2020中考几何秘籍:初中最全几何定理和解题思路
  10. java实现dex转jar,Android 逆向相关