洛谷 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$ 的情况 ...
随机推荐
- NHibernate3快速上手教程FluentNHibernate配置与DBHelper(已过期,有更好的)
很多学习NHibernate的新手很容易卡在配置文件这一关,正所谓万事开头难,上手后再配合官方文档就比较容易了. 网上关于配置文件的资料非常多,但由于版本的问题,许多老的教程中都没有明确指出类库的版本 ...
- EF中如何为表添加新的字段和映射
首先先了解一下ef生成的模型edmx的代码,传送门:http://www.cnblogs.com/yushengbo/p/4807715.html 一.添加新的字段 例子就用我现在项目的这个吧,首先在 ...
- 如何在线测试Exchange的速度
最新碰到了客户需要比较国内版和国际版的Office365的速度问题,微软提供在线工具测试 这里以Exchange 测试为例子,请参考. PS Onenote贴过来只能至图片,各位看官只能将就了 这里有
- django 连接mysql报错
原因: 问题1. 即从mysql5.7版本之后,默认采用了caching_sha2_password验证方式. 问题2. 然后在执行 python manage.py makemigrations依 ...
- vmware安装64位系统“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”的问题
虚拟机使用的是VMware Workstation,并且首次在虚拟机体验64 位系统.在新建好虚拟机,运行时候就出现了VMware Workstation 的提醒:此主机支持 Intel VT-x,但 ...
- SpringBoot日志配置(详解) 涉及控制台输出日志、生成日志文件、日志级别修改、hibernate日志不输出
写在前面 本篇主要讲述日志配置,看完本篇可以解决下述问题, 控制台输出日志.生成日志文件.日志级别修改.hibernate日志不输出 Git Demo Path:https://github.com/ ...
- 软工2017第五周——个人PSP
10.13 --10.19本周例行报告 1.PSP(personal software process )个人软件过程. 类型 任务 预计时间 开始时间 结束时间 中断时 ...
- psp1111
1 本周psp 2.本周进度条 3.本周累积进度图 代码累积折线图 博文字数累积折线图 4.本周PSP饼状图
- Alpha版——版本控制报告(Thunder)
Part One 回答问题: 0.在吹牛之前,先回答这个问题:如果你的团队来了一个新队员,有一台全新的机器,你们是否有一个文档,只要设置了相应的权限,她就可以根据文档,从头开始搭建环境,并成功地把最新 ...
- laravel开发环境部署遇到的问题和个人感受
>感受 用chrome浏览器 英语很重要 跟上更新的步伐 要不断学习 问问题要把问题描述清楚,先尝试解决,解决不了再问大佬 情绪要稳定,不能因为一个问题困扰两天就想放弃了 发现了 stack o ...