洛谷 P3952 时间复杂度 解题报告
P3952 时间复杂度
题目描述
小明正在学习一种新的编程语言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 \le 10\))个程序需要计算时间复杂度。 每个程序我们只需抽取其中\(F\) \(i\) \(x\) \(y\)和\(E\)即可计算时间复杂度。注意:循环结构 允许嵌套。
接下来每个程序的第一行包含一个正整数\(L\)和一个字符串,\(L\)代表程序行数,字符 串表示这个程序的复杂度,\(O(1)\)表示常数复杂度,\(O(n\)^\(w)\)表示复杂度为\(n^w\) ,其中\(w\)是一个小于100的正整数(输入中不包含引号),输入保证复杂度只有\(O(1)\)和\(O(n\)^\(w)\)两种类型。
接下来\(L\)行代表程序中循环结构中的\(F\) \(i\) \(x\) \(y\)或者\(E\)。 程序行若以\(F\)开头,表示进入一个循环,之后有空格分离的三个字符(串)\(i\) \(x\) \(y\), 其中\(i\)是一个小写字母(保证不为\(n\)),表示新建的变量名,\(x\)和\(y\)可能是正整数或\(n\),已知若为正整数则一定小于100。
程序行若以\(E\)开头,则表示循环体结束。
输出格式:
输出文件共\(t\)行,对应输入的\(t\)个程序,每行输出\(Yes\)或\(No\)或者\(ERR\)(输出中不包含引号),若程序实际复杂度与输入给出的复杂度一致则输出\(Yes\),不一致则输出\(No\),若程序有语法错误(其中语法错误只有: ① \(F\)和\(E\)不匹配 ②新建的变量与已经存在但未被销毁的变量重复两种情况),则输出\(ERR\)。
注意:即使在程序不会执行的循环体中出现了语法错误也会编译错误,要输出\(ERR\)。
数据规模与约定
对于\(30\%\)的数据:不存在语法错误,数据保证小明给出的每个程序的前\(L/2\)行一定为以\(F\)开头的语句,第\(L/2+1\)行至第\(L\)行一定为以\(E\)开头的语句,\(L \le 10\),若\(x\)、 \(y\)均为整数,\(x\)一定小于\(y\),且只有\(y\)有可能为\(n\)。
对于\(50\%\)的数据:不存在语法错误, \(L \le 100\),且若\(x\)、\(y\)均为整数,\(x\)一定小于\(y\), 且只有\(y\)有可能为\(n\)。
对于\(70\%\)的数据:不存在语法错误, \(L \le 100\)。
对于\(100\%\)的数据: \(L \le 100\)。
今天晚上写了好久,还重构了一次代码,考场上估计会凉。
写模拟题的技巧:
- 先在纸上写好流程和细节,最后再动手
- 多使用函数完成功能,使结构清晰
Code:
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int N=205;
const int inf=0x3f3f3f3f;
int used[N];//维护字母使用
struct node
{
int fzd,var;
}S[N];
int tot,n,t,err,fzd,fzd0,ans;
string s;
int read_var()//读取变量
{
cin>>s;
if(used[s[0]]) err=1;
used[s[0]]=1;
return s[0];
}
int read_num()//读取数字0
{
cin>>s;
if(s[0]=='n') return inf;
int x=0;
for(int i=0;i<s.size();i++)
x=(x<<3)+(x<<1)+s[i]-'0';
return x;
}
int read_fzd()//读取复杂度
{
int a=read_num(),b=read_num();
if(a!=inf&&b==inf) return 1;
if(a>b) return -inf;
return 0;
}
void read()//读入一整行
{
cin>>s;
if(s[0]=='F')
{
S[++tot].var=read_var();//读取变量
S[tot].fzd=read_fzd();//读取复杂度
fzd+=S[tot].fzd;//处理复杂度
ans=max(fzd,ans);//更新复杂度
}
else
{
if(!tot) {err=1;return;}//层数错误
used[S[tot].var]=0;//取消变量使用
fzd-=S[tot--].fzd;//还原复杂度
}
}
void read_initfzd()//读取初始复杂度
{
cin>>s;
if(s[2]=='1') return;
for(int i=4;s[i]!=')';i++)
fzd0=(fzd0<<3)+(fzd0<<1)+s[i]-'0';
}
void init()
{
memset(used,0,sizeof(used));
ans=fzd=fzd0=tot=err=0;
}
void work()
{
scanf("%d",&n);
read_initfzd();
for(int i=1;i<=n;i++)
read();
if(tot||err) printf("ERR\n");
else if(fzd0==ans) printf("Yes\n");
else printf("No\n");
}
int main()
{
scanf("%d",&t);
while(t--)
{
init();
work();
}
return 0;
}
2018.7.26
洛谷 P3952 时间复杂度 解题报告的更多相关文章
- 洛谷 P2058 海港 解题报告
P2058 海港 题目描述 小K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客. 小K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况: ...
- 洛谷 P3956 棋盘 解题报告
P3956 棋盘 题目描述 有一个\(m×m\)的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你所站在的位置必须是有颜色的(不能 ...
- 洛谷 P1979 华容道 解题报告
P1979 华容道 题目描述 小\(B\)最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少需要多少时 ...
- BZOJ 3545 / 洛谷 P4197 Peaks 解题报告
P4197 Peaks 题目描述 在\(\text{Bytemountains}\)有\(N\)座山峰,每座山峰有他的高度\(h_i\).有些山峰之间有双向道路相连,共\(M\)条路径,每条路径有一个 ...
- 虔诚的墓主人(BZOJ1227)(洛谷P2154)解题报告
题目描述 小W是一片新造公墓的管理人.公墓可以看成一块N×M的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地. 当地的居民都是非常虔诚的基督徒,他们愿意提前为自己找一块合适墓地. ...
- 洛谷P3952 时间复杂度【字符串】【模拟】
题目描述 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会来啦!下面请你编写程序 ...
- 洛谷 - P3952 - 时间复杂度 - 模拟
https://www.luogu.org/problemnew/show/P3952 这个模拟,注意每次进入循环的时候把新状态全部入栈,退出循环的时候就退栈. 第一次就错在发现ERR退出太及时,把剩 ...
- 洛谷P3952 时间复杂度
大毒瘤...... 时隔快半年我终于花了两个小时堪堪A掉这一题...果然我还没有准备好. 想法:用DFS模拟递归. 时间复杂度的处理:每层循环取max,然后相加. 最大难点:各种繁杂而令人发指的特判. ...
- 计蒜客 时间复杂度 (模拟) & 洛谷 P3952 时间复杂度
链接 : Here! 思路 : 这是一道大模拟, 区分好情况就没问题了 循环构成部分 : $F , x , i , j$ 和 $E$ , 需要注意的是 $i , j$, - 分析 $i, j$ 的情况 ...
随机推荐
- jenkins通过maven指定testng的xml文件,并给testng代码传参
1.jenkins设置参数化构建,设置要传的参数名和值 2.指定testng的xml文件,在jenkins的输入以下 3.在pom.xml文件分别引用jenkins的参数,设置两个property & ...
- 通过 zxing 生成二维码
二维码现在随处可见,在日常的开发中,也会经常涉及到二维码的生成,特别是开发一些活动或者推广方面的功能时,二维码甚至成为必备功能点.本文介绍通过 google 的 zxing 包生成带 logo 的二维 ...
- 第三十九篇 Python异常处理
一. 什么是异常 异常就是程序运行时发生的错误,在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止,在python中,错误触发的异常如下 错误分成两种: #语法 ...
- 初学Direct X(9) ——文字的显示
初学Direct X(9) --文字的显示 本次学习如何使用ID3DXFont创建字体,使得我们可以在任何安装了Windows系统中TrueType字体来打印文字,不过最好使用标准字体,这样文字在每一 ...
- Java并发基础--Lock的学习
一.Lock的出现 Lock的主要作用实现线程之间的同步互斥,与synchronized关键字的效果是一样的,synchronized是Java语言内置的特性,那么为什么又出现了Lock呢?原因是sy ...
- lintcode407 加一
加一 给定一个非负数,表示一个数字数组,在该数的基础上+1,返回一个新的数组. 该数字按照大小进行排列,最大的数在列表的最前面. 您在真实的面试中是否遇到过这个题? Yes 样例 给定 [1,2,3] ...
- javaee开发工具及环境配置过程
在配置javaee开发环境的过程中遇到过很多问题,在此系统的整理一下我之前的配置过程 注:配置过程学习自<JSP&Servlet学习笔记(第二版)>详细过程可以阅读此书.在文章的最 ...
- docker 命令笔记
docker images 查看镜像 docker search 查找镜像 docker pull 拉取镜像 docker push 推送镜像 docker ps 查看正在运行的容器 docker p ...
- Django创建App报错
在django下创建APP项目时遇到的坑 python manage.py startapp app01 报错内容如下: 解决:找到报错中的文件夹151行删除items(),)中的逗号即可 在命令行下 ...
- Kali渗透测试-SNMP
1.snmpwalk -v指定snmpwalk版本 -c指定密码 2.snmp-check 获取系统信息,主机名,操作系统及架构 获取用户账户信息 获取网络信息 获取网络接口信息 IP信息 路由信息 ...