【luogu P3952 时间复杂度】 题解
对于2017 D1 T2 这道题
实实在在是个码力题,非常考验耐心。
其实大体的思路并不是非常难想出来,但是要注意的小细节比较多。
题目链接:https://www.luogu.org/problemnew/show/P3952
思路
对于每一个程序,先读入L和O(),并将其中的时间复杂度抠出来。
其次整行读入字符串,即所给定的程序。
判断第一个字符是F or E
F i x y 需要把x y拿出来,把i压进栈
E 退栈 压进i后为了方便退栈及退栈时判断,用一个flag标记
每做完一个程序,与前面抠出来的时间复杂度对比判断yesnoerr即可。
注意
1.我的readx和ready函数比较暴力,直接截取常数和n可能存在的位置并保存。所以在考虑情况时,常数与n的位置不能搞错,也不能少考虑。
2.在每搞完一个程序时,要把初始值和标记都初始化一遍。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>
using namespace std;
int L,t,anso,codeo;//anso=0 O(1) anso=x O(n^x) 输入给的时间复杂度 codeo 自己算的时间复杂度 if anso==codeo yes else no if codeo==-1 err
string code[];//按行输入所给代码(F,E)
string ans;//读入给定的复杂度 O()
int readx(string x)
{
int num;
if(x[] >= '' && x[] <= '') num = x[]-'';
if(x[] >= '' && x[] <= '') num = (x[]-'')*+x[]-'';
if(x[] == 'n') num = ;
return num;
} //抠出给定的复杂度 x
int ready(string x)
{
int num;
if(x[] >= '' && x[] <= '' && x[] <= '' || x[] >= '') num = x[]-'';
if(x[] >= '' && x[] <= '' && x[] <= '' || x[] >= '') num = x[]-'';
if(x[] >= '' && x[] <= '' && x[] >= '' && x[] <= '') num = (x[]-'')*+x[]-'';
if(x[] >= '' && x[] <= '' && x[] >= '' && x[] <= '') num = (x[]-'')*+x[]-'';
if(x[] == 'n') num = ;
if(x[] == 'n') num = ;
return num;
}//抠出给定的复杂度 y
int check1()
{
int res;
if(ans[] == '') res = ;
if(ans[] == 'n')
{
if(ans[]<='' && ans[]>='')
res = ans[]-'';
if(ans[]<='' && ans[]>='')
res = (ans[]-'')* + ans[]-'';
}//记录输入给的复杂度
return res;
}
int check2()
{
stack<int> s;
int flag=-;//标记
bool fe[]={};//上面都是便于栈操作,fe来记录变量名
int res=,now=;//now来记录当前循环中的时间复杂度,res是整个程序的时间复杂度
bool cflag[]={};//记录变量是否重复 0 则没用过 1 用过 changeflag
int xnum,ynum; for(int i=;i<=L;i++)
{ if(code[i][]=='F')
{
int k=code[i][]-'a';
if(cflag[k]) return -;
s.push(k);
cflag[k] = ; xnum=readx(code[i]); ynum=ready(code[i]);
if(ynum-xnum>)
{
if(flag==-)
{
now++;
res=max(res,now);
fe[k]=;
}
}
if(xnum>ynum)
{
if(flag==-) flag=k;
}
} if(code[i][]=='E')
{
if(s.empty()) return -;
int k=s.top();
s.pop();cflag[k]=false;
if(flag==k) flag=-;
if(fe[k])
{
fe[k]=false;
now--;
}
}
}
if(s.size()) return -;
return res;
}
int main()
{
scanf("%d",&t);
while(t--)
{ scanf("%d ",&L);getline(cin,ans);
anso=check1(); for(int i=;i<=L;i++)getline(cin,code[i]);
codeo=check2(); if(codeo==-) cout<<"ERR"<<endl;
else
{
if(anso!=codeo) cout<<"No"<<endl;
if(anso==codeo) cout<<"Yes"<<endl;
}
}
return ;
}
【luogu P3952 时间复杂度】 题解的更多相关文章
- luogu P3952 时间复杂度 模拟
题目链接 luogu P3952 时间复杂度 题解 直接模拟即可 注意不要直接return 我真是naive ...... 代码 #include<map> #include<sta ...
- [LUOGU] P3952 时间复杂度
其实,也没那么难写 这种模拟题,仔细分析一下输入格式,分析可能的情况,把思路写在纸上,逐步求精,注意代码实现 主要思路就是算一个时间复杂度,和给出的复杂度比较,这就先设计一个函数把给出的复杂度由字符串 ...
- [NOIp2017] luogu P3952 时间复杂度
跪着看评测很优秀. 题目描述 给你若干个程序,这些程序只有 For 循环,求这些程序的时间复杂度. Solution 大模拟.讲下细节. flag[i]flag[i]flag[i] 表示第 iii 位 ...
- P3952 时间复杂度
P3952 时间复杂度 题目描述 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机 ...
- 洛谷 P3952 时间复杂度 解题报告
P3952 时间复杂度 题目描述 小明正在学习一种新的编程语言A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会 ...
- 洛谷 P3952时间复杂度 (本地AC测评RE的伪题解)
[题目描述] 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会来啦!下面请你编写 ...
- 洛谷 - P3952 - 时间复杂度 - 模拟
https://www.luogu.org/problemnew/show/P3952 这个模拟,注意每次进入循环的时候把新状态全部入栈,退出循环的时候就退栈. 第一次就错在发现ERR退出太及时,把剩 ...
- 洛谷P3952 时间复杂度【字符串】【模拟】
题目描述 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会来啦!下面请你编写程序 ...
- LOJ P3952 时间复杂度 noip 暴力 模拟
https://www.luogu.org/problemnew/show/P3952 模拟,日常认识到自己zz. #include<iostream> #include<cstdi ...
随机推荐
- topN问题
topN问题:给出一个数组,找出前N个最大的元素. topN问题可以用分治法解决,这个问题与快速排序类似,快速排序是用一个数对数组进行划分,topN问题则不需完成排序,只需划分出前n个最大的数字即可. ...
- nyoj 47——过河问题——————【贪心】
过河问题 时间限制:1000 ms | 内存限制:65535 KB 难度:5 描述 在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边.如果不借助手电筒的话,大家是无论如何也不敢过桥去的 ...
- 10 个最佳的 Node.js 的 MVC 框架
补充:http://nokit.org/ https://thinkjs.org/zh-cn/doc/index.html Node.js 是一个基于Chrome JavaScript 运行时建立的一 ...
- Unity 基础
Unity 基础是unity入门的关键.他将讲解Unity的界面, 菜单项,使用资源,创设场景,并发布版本. 当你读完这段,你将理解unity是怎么工作的,如何有效地使用它,并且完成一个基本的游戏. ...
- python中操作列表
1.遍历列表 可以用for循环遍历打印非常实用 摸板: for 临时变量 in 列表 : print(临时变量) 注意缩进 , 注意冒号 2.创建数值列表 (1)使用range()函数 , 函数的范围 ...
- HDU 1003 最大连续和
http://www.acmerblog.com/hdu-1003-Max-Sum-1258.html 这里难点只有求起始位置,把握状态变化就行.一般这种子序列问题,都可以用dp简化 #include ...
- vue——计算属性和侦听器
一.计算属性(data中的相关数据) 侦听多个属性时——计算属性 comuted. 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: & ...
- 在C#中生成GUID的方法
var guid = Guid.NewGuid();Debug.WriteLine(guid.ToString()); //1f3c6041-c68f-4ab3-ae19-f66f541e3209 ...
- Kafka监控利器
开发过程中,kafka几乎是标配的Mq,如果有一个kafka的监控助手,哪就更完美了,常用的kafka监控工具有 KafkaOffsetMonitor .Kafka Manager.Capillary ...
- DrawerLayout侧滑
DrawerLayout是Support Library包中实现了侧滑菜单效果的控件,可以说DrawerLayout是因为第三方控件如SlidingMenu等出现之后,google借鉴而出现的产物.D ...