洛谷 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$ 的情况 ...
随机推荐
- 获取附加在方法上的Attribute
如下: class Program { static void Main(string[] args) { var methodInfo = typeof(Program).GetMethod(&qu ...
- git 操作几个命令
git clone ssh://lijianfeng@192.168.1.246:29418/GMGameSDK压栈:git stash查状态:git status切换到要修改的提交:git reb ...
- XSS--编码绕过,qcms,鲶鱼cms
一.编码绕过 1)HTML进制编码 标签中的某些属性值可以使用html十进制.十六进制表示 2)JavaScript编码 JavaScript支持unicode.八进制.十六进制.十进制等 3)URL ...
- selenium--特殊元素定位
该篇博客总结特殊元素(select.radio\checkbox.时间控件.文件上传.图片验证码.模拟鼠标操作.Js 或 JQuery调用)操作. 1.select @Test public void ...
- Aizu - 2249
注意先保证距离最短,再来判断价格 邻接矩阵回朝内存 ,要用邻接表的 #include<bits/stdc++.h> using namespace std; #define inf 0x ...
- Centos7添加静态路由
本文摘取自 Centos7系统配置上的变化(二)网络管理基础 一.ip route显示和设定路由 1.显示路由表 [root@centos7 ~]# ip route show default via ...
- OSS文件上传及OSS与ODPS之间数据连通
场景描述 有这样一种场景,用户在自建服务器上存有一定数量级的CSV格式业务数据,某一天用户了解到阿里云的OSS服务存储性价比高(嘿嘿,颜值高),于是想将CSV数据迁移到云上OSS中,并且 ...
- STM32串口通信UART使用
STM32串口通信UART使用 uart使用的过程为: 1. 使能GPIO口和UART对应的总线时钟 2. 配置GPIO口的输出模式 3. 配置uart口相关的基本信息 4. 使能uart口的相关的中 ...
- Thinkphp实现excel导出数据
前端: 点击导出触发click事件,传值export指令和args关键字(args是指我们是否有查询取哪些数据)到控制器 $(document).on("click", " ...
- java知乎爬虫
好久没写博客了,前阵子项目忙着上线,现在有点空闲,就把最近写的一个爬虫和大家分享下,统计结果放在了自己买的阿里云服务器上(点此查看效果),效果如下: 程序是在工作之余写的,用了java 的webmgi ...