洛谷 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$ 的情况 ...
随机推荐
- 游戏人工智能 读书笔记 (四) AI算法简介——Ad-Hoc 行为编程
本文内容包含以下章节: Chapter 2 AI Methods Chapter 2.1 General Notes 本书英文版: Artificial Intelligence and Games ...
- CSS选择器语法&示例
CSS3 选择器 在 CSS 中,选择器是一种模式,用于选择需要添加样式的元素. "CSS" 列指示该属性是在哪个 CSS 版本中定义的.(CSS1.CSS2 还是 CSS3.) ...
- 【selenium】selenium全分享
第一节:selenium基础 [http://note.youdao.com/noteshare?id=43603fb53593bfc15c28bc358a3fa6ec] 目录: selenium简介 ...
- [Clr via C#读书笔记]Cp1CLR执行模型
Cp1CLR执行模型 本章的概念点 CLR=Common Language Runtime 内存管理,程序集加载,安全性,异常处理和线程同步.CLR是基础,支持着面向它的各种语言.各种语言会被对应的编 ...
- Stunnel客户端安装和配置
声明:本文并非原创,转自华为云帮助中心的分布式缓存服务(DCS)的用户指南. 本文以公网访问华为云分布式缓存服务的Redis缓存为示例,介绍Stunnel客户端在各操作系统下的安装和配置. Stunn ...
- Attention注意力机制介绍
什么是Attention机制 Attention机制通俗的讲就是把注意力集中放在重要的点上,而忽略其他不重要的因素.其中重要程度的判断取决于应用场景,拿个现实生活中的例子,比如1000个人眼中有100 ...
- (转载)IE8+兼容经验小结
本文分享下我在项目中积累的IE8+兼容性问题的解决方法.根据我的实践经验,如果你在写HTML/CSS时候是按照W3C推荐的方式写的,然后下面的几点都关注过,那么基本上很大一部分IE8+兼容性问题都OK ...
- Thunder团队第五周 - Scrum会议5
Scrum会议5 小组名称:Thunder 项目名称:i阅app Scrum Master:翟宇豪 工作照片: 杨梓瑞同学在拍照,所以不在照片内. 参会成员: 王航:http://www.cnblog ...
- kmeans算法理解及代码实现
github:kmeans代码实现1.kmeans代码实现2(包含二分k-means) 本文算法均使用python3实现 1 聚类算法 对于"监督学习"(supervised ...
- LintCode-378.将二叉查找树转换成双链表
将二叉查找树转换成双链表 将一个二叉查找树按照中序遍历转换成双向链表. 样例 给定一个二叉查找树: 返回 1<->2<->3<->4<->5. 标签 链 ...