其实,也没那么难写

这种模拟题,仔细分析一下输入格式,分析可能的情况,把思路写在纸上,逐步求精,注意代码实现

主要思路就是算一个时间复杂度,和给出的复杂度比较,这就先设计一个函数把给出的复杂度由字符串形式化为数字形式

然后开始分析,对于F:

  1. 检查变量合法
  2. 分类:常量-常量和n-n:O(1),常量-n:O(n),n-常量:无法进入,记为0,特殊标记一个slay

    3.压栈:栈内记录变量名和贡献的复杂度,用map标记变量为使用过

    对于E:
  3. 检查栈空
  4. 如果没有slay标记就更新答案
  5. 弹栈,清空变量使用

一个问题:ERR不能直接返回,剩下的程序还是要读完的

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<map>
using namespace std; int n;
string ostring; struct Node{
string var;
int o,slay;
Node(string s="",int _=0,int l=0){var=s;o=_;slay=l;}
}; int ans,cur;
Node sta[10000];
int top;
map<string,int> mp;
int checkO(string s){//return the O of s
if(s=="O(1)") return 0;
int ret=0,p=0;char c;
while(c=s[p++],!isdigit(c));
while(isdigit(c)){
ret=ret*10+c-'0';
c=s[p++];
}
return ret;
} int push(string var,string st,string ed){
if(mp[var]==1)return -1; mp[var]=1;
if(st=="n"&&ed=="n") return 0;
if(st=="n") return -2;//slay =1
if(ed=="n") return 1;
int l=0,r=0;
int len=st.size();
for(int i=0;i<len;i++){
l*=10;
l+=st[i]-'0';
}
len=ed.size();
for(int i=0;i<len;i++){
r*=10;
r+=ed[i]-'0';
}
if(l<=r) return 0;
else return -2;
} int pop(){
if(!top) return -1;
Node tmp=sta[top--];
mp[tmp.var]=0;
if(!tmp.slay) ans=max(ans,cur);
cur-=tmp.o;
} int solve(int len){
int fail=0;
ans=0;cur=0;top=0;mp.clear();
int tmp=0,sl=0;
string s,var,st,ed;
for(int i=1;i<=len;i++){
sl=0;
cin>>s;
if(s=="F"){
cin>>var>>st>>ed;
tmp=push(var,st,ed);
if(tmp==-1) fail=1;
if(tmp==-2) sl=1,tmp=0;
if(top>0) sl|=sta[top].slay;
sta[++top]=Node(var,tmp,sl);
cur+=tmp;
}else{
tmp=pop();
if(tmp==-1) fail=1;
}
}
if(top) return -1;
if(fail) return -1;
return ans;
} int main(){
int T;
cin>>T;
while(T--){
top=0;ans=0;cur=0;
cin>>n>>ostring;
int aim=checkO(ostring);
int res=solve(n);
if(res==-1) {puts("ERR");continue;}
if(aim==res) {puts("Yes");continue;}
puts("No");
}
return 0;
}

[LUOGU] P3952 时间复杂度的更多相关文章

  1. luogu P3952 时间复杂度 模拟

    题目链接 luogu P3952 时间复杂度 题解 直接模拟即可 注意不要直接return 我真是naive ...... 代码 #include<map> #include<sta ...

  2. 【luogu P3952 时间复杂度】 题解

    对于2017 D1 T2 这道题 实实在在是个码力题,非常考验耐心. 其实大体的思路并不是非常难想出来,但是要注意的小细节比较多. 题目链接:https://www.luogu.org/problem ...

  3. [NOIp2017] luogu P3952 时间复杂度

    跪着看评测很优秀. 题目描述 给你若干个程序,这些程序只有 For 循环,求这些程序的时间复杂度. Solution 大模拟.讲下细节. flag[i]flag[i]flag[i] 表示第 iii 位 ...

  4. P3952 时间复杂度

    P3952 时间复杂度 题目描述 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机 ...

  5. 洛谷 P3952 时间复杂度 解题报告

    P3952 时间复杂度 题目描述 小明正在学习一种新的编程语言A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会 ...

  6. 洛谷 - P3952 - 时间复杂度 - 模拟

    https://www.luogu.org/problemnew/show/P3952 这个模拟,注意每次进入循环的时候把新状态全部入栈,退出循环的时候就退栈. 第一次就错在发现ERR退出太及时,把剩 ...

  7. 洛谷P3952 时间复杂度【字符串】【模拟】

    题目描述 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会来啦!下面请你编写程序 ...

  8. LOJ P3952 时间复杂度 noip 暴力 模拟

    https://www.luogu.org/problemnew/show/P3952 模拟,日常认识到自己zz. #include<iostream> #include<cstdi ...

  9. 洛谷P3952 时间复杂度

    大毒瘤...... 时隔快半年我终于花了两个小时堪堪A掉这一题...果然我还没有准备好. 想法:用DFS模拟递归. 时间复杂度的处理:每层循环取max,然后相加. 最大难点:各种繁杂而令人发指的特判. ...

随机推荐

  1. ignoring option MaxPermSize=256m; support was removed in 8.0 - unsupported JVM property

    MaxPermSize 在JVM8 中已经被删除. 可以使用 JAVA_OPTS="-Xms1303m -Xmx1303m -XX:MaxPermSize=256m 参考 https://b ...

  2. Huber鲁棒损失函数

    在统计学习角度,Huber损失函数是一种使用鲁棒性回归的损失函数,它相比均方误差来说,它对异常值不敏感.常常被用于分类问题上. 下面先给出Huber函数的定义: 这个函数对于小的a值误差函数是二次的, ...

  3. PAT甲级——1103 Integer Factorization (DFS)

    本文同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/90574720 1103 Integer Factorizatio ...

  4. Python随笔---return与print,全局变量与局部变量

    Return是指返回一个数值,一般在函数中应用较多 Print则是指把结果打印出来,显示在屏幕上 def sum(a,b): total=a+b print('函数内:',total) return ...

  5. [软件工程基础]Alpha 展示博客

    团队成员 个人简介 个人简介参照团队介绍博客. 个人博客 王嘉睿爵:http://www.cnblogs.com/whynotRW/ 游心:http://www.cnblogs.com/jefhq/ ...

  6. Debian 跨版本升级

    相对于某些重量级 Linux 发行版而言,同样是通过网络跨版本升级,Debian 的升级过程总要显得轻快很多.不会因为要下载数量惊人的软件包并安装而把升级时间拉得很长,也不用担心中途某些程序崩溃退出导 ...

  7. Java使用comms-net jar包完成ftp文件上传进度的检测功能

    本文章只讲述大致的思路与本次功能对应的一些开发环境,具体实现请结合自己的开发情况,仅供参考,如果有不对的地方,欢迎大家指出! 准备环境:JDK1.7 OR 1.8.eclipse.ftp服务器(可自行 ...

  8. Jmeter4.0----设置集合点_并发(11)

    1.说明 LR中集合点可以设置多个虚拟用户等待到一个点,同时触发一个事务,以达到模拟真实环境下多个用户同时操作,实现性能测试的最终目的. jmeter中使用Synchronizing Timer实现L ...

  9. 049 Group Anagrams 字谜分组

    给定一个字符串数组,将相同字谜组合在一起.(字谜是指颠倒字母顺序而成的字)例如,给定 ["eat", "tea", "tan", " ...

  10. 超全面的vue.js使用总结

    一.Vue.js组件 vue.js构建组件使用 Vue.component('componentName',{ /*component*/ }): 这里注意一点,组件要先注册再使用,也就是说: Vue ...