luogu 3952 时间复杂度(模拟)
时间复杂度
这道题从两个月前开始做,一直没做出来,最后今晚决心一定要做出来。于是开始认真的在打草纸上写思路,最后在AC的那一刻,差点哭了出来!!
题目大意
这个自己看吧,noip2017的D1T2
solution
先介绍一下这道题我们用到的每个变量他们的用处
- stack[]记录变量的循环层
- vis[]记录变量在栈中是否出现过
- cmp函数,这个可以用作比较循环中a和b的大小
a<b -> 进入新的一层循环\\
a>b -> 无法进入新的循环,循环终止\\
a=b -> 此循环为o1
\\
\end{cases}
\]
- stop 如果循环已经无法进入,那么就用stop计数
- ans表示最终的复杂度层数,maxn表示当前一层循环的复杂度层数
接下来是三种状态的 - ERR 条件
F、E不匹配\\
变量名重复
\\
\end{cases}
\]
- No,Yes均为题目定义
呼。然后就是代码了
首先你得会字符串处理一系列问题,如w,a,b之类的数字值,然后你得会普通的栈思想。
接下来第一步,我们如何处理复杂度问题。我的思路是分o1和on方的
o1你得判断他的循环层数不得为正整数,然后判一下ERR就可以了。
on方的话,你要准确判断他的循环层数
然后就是cmp函数,我的整段代码的精妙就全在cmp函数里了。
cmp函数判断的是a和b的值。
首先如果b不是n,那么他就不会形成一个循环层
其次如果数为n,那么就赋为inf
然后如果两个数如果都是数字,那么就为o1,直接按照相等处理
AC代码!
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
const int inf = 2147483647;
char s[200],a[200],b[200];
char stack[200];
char F,id;
int top;
bool vis[200],ERR;
int cmp(char *a,char *b) {
int an=0,bn=0;
if(a[0]=='n') an=inf;
else {
for(int i=0; i<strlen(a); i++)
an=an*10+a[i]-'0';
}
if(b[0]=='n') bn=inf;
else {
for(int i=0; i<strlen(b); i++)
bn=bn*10+b[i]-'0';
}
if(an>bn) return -1;
if(an<bn && bn==inf) return 1;
if(an==bn) return 0;
}
int main() {
int T;
scanf("%d",&T);
while(T--) {
int n;
memset(s,0,sizeof(s));
memset(vis,0,sizeof(vis));
memset(stack,0,sizeof(stack));
top=0;
scanf("%d",&n);
cin >> s;
int maxn=0,ans=0;
int stop=0;
ERR=false;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
if(s[2]=='1') {
for(int i=1; i<=n; i++) {
cin >> F;
if(F=='E') {
if(stop)stop--;
vis[stack[top--]]=false;
if(top==0) {
ans=max(ans,maxn);
maxn=0;
}
if(top<0)ERR=true;
} else if(F=='F') {
cin >> id;
if(vis[id]) ERR=true;
else vis[id]=1;
stack[++top]=id;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
cin >> a >> b;
if(stop) {
stop++;
continue;
}
int flag=cmp(a,b);
if(flag==1) if(top>maxn)maxn++;
if(flag==-1) stop++;
}
}
if(top || ERR) {
printf("ERR\n");
continue;
}
if(ans!=0) {
printf("No\n");
continue;
}
printf("Yes\n");
}
if(s[2]=='n') {
int num=0;
for(int i=0; i<strlen(s); i++)
if(s[i]>='0'&&s[i]<='9')num=num*10+s[i]-'0';
for(int i=1; i<=n; i++) {
cin >> F;
if(F=='E') {
if(stop)stop--;
vis[stack[top--]]=false;
if(top==0) {
ans=max(ans,maxn);
maxn=0;
}
if(top<0)ERR=true;
} else if(F=='F') {
cin >> id;
if(vis[id]) ERR=true;
else vis[id]=1;
stack[++top]=id;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
cin >> a >> b;
if(stop) {
stop++;
continue;
}
int flag=cmp(a,b);
if(flag==1) if(top>=maxn+1)maxn++;
if(flag==-1) stop++;
}
}
if(top || ERR) {
printf("ERR\n");
continue;
}
if(ans!=num) {
printf("No\n");
continue;
}
printf("Yes\n");
}
}
return 0;
}
tips:还有一件事请非常的重要,做模拟题之前,一定要理清思路,最好写在纸上,因为码量大的题目很容易会健忘,这样会有以思维时间换代码时间,垃圾思维大幅度缩短。
你会发现我曾经wa了无数发,都是没有认真思考的结果!
luogu 3952 时间复杂度(模拟)的更多相关文章
- luogu P3952 时间复杂度 模拟
题目链接 luogu P3952 时间复杂度 题解 直接模拟即可 注意不要直接return 我真是naive ...... 代码 #include<map> #include<sta ...
- luogu 3952 时间复杂度
noip2017 D1T2 时间复杂度 某zz选手考场上写了1.5h 考完之后发现自己写的是错的 但是结果A了??? 题目大意: 一种新的编程语言 A++ 给出一个程序只有循环语句 并给出这个程序的时 ...
- [Luogu 3952] NOIP2017 时间复杂度
[Luogu 3952] NOIP2017 时间复杂度 一年的时间说长不长,说短,也不短. 一年之内无数次觉得难得可怕的题目,原来也就模拟这么回事儿. #include <cstdio> ...
- 洛谷 - P3952 - 时间复杂度 - 模拟
https://www.luogu.org/problemnew/show/P3952 这个模拟,注意每次进入循环的时候把新状态全部入栈,退出循环的时候就退栈. 第一次就错在发现ERR退出太及时,把剩 ...
- 【luogu P3952 时间复杂度】 题解
对于2017 D1 T2 这道题 实实在在是个码力题,非常考验耐心. 其实大体的思路并不是非常难想出来,但是要注意的小细节比较多. 题目链接:https://www.luogu.org/problem ...
- [LUOGU] P3952 时间复杂度
其实,也没那么难写 这种模拟题,仔细分析一下输入格式,分析可能的情况,把思路写在纸上,逐步求精,注意代码实现 主要思路就是算一个时间复杂度,和给出的复杂度比较,这就先设计一个函数把给出的复杂度由字符串 ...
- 计蒜客 时间复杂度 (模拟) & 洛谷 P3952 时间复杂度
链接 : Here! 思路 : 这是一道大模拟, 区分好情况就没问题了 循环构成部分 : $F , x , i , j$ 和 $E$ , 需要注意的是 $i , j$, - 分析 $i, j$ 的情况 ...
- [NOIp2017] luogu P3952 时间复杂度
跪着看评测很优秀. 题目描述 给你若干个程序,这些程序只有 For 循环,求这些程序的时间复杂度. Solution 大模拟.讲下细节. flag[i]flag[i]flag[i] 表示第 iii 位 ...
- luoguP3952 [NOIP2017]时间复杂度 模拟
原本只是想看下多久能码完时间复杂度 然后在30min内就码完了,然后一A了???? 首先,这题完全可以离线做 我们先把所有的操作读完,判断合不合法之后,再去判断和标准答案的关系 具体而言 把所有的操作 ...
随机推荐
- 数据库表结构导出sql语句
在“对象资源管理器”中找到要导出的表,选中该表并单击右键,“编写表脚本为(S)”/“CREATE到(C)”/“新查询编辑器窗口”即可查看该表的建表语句,Ctrl+S保存为sql脚本文件
- P1410 子序列
题目描述 给定一个长度为N(N为偶数)的序列,问能否将其划分为两个长度为N/2的严格递增子序列, 输入输出格式 输入格式: 若干行,每行表示一组数据.对于每组数据,首先输入一个整数N,表示序列的长度. ...
- 第五课: - Stack / Unstack / Transpose函数
第 5 课 我们将简要介绍 stack 和 unstack 以及 T (Transpose)函数. 在用pandas进行数据重排时,经常用到stack和unstack两个函数.stack的意思是堆 ...
- 09.javaweb简单标签编程
一.简单标签 1, 简介:由于传统标签使用三个标签接口来完成不同的功能,显得过于繁琐,不利于标签技术的推广, SUN公司为降低标签技术的学习难度,在JSP 2.0中定义了一个更为简单.便于编写和调用 ...
- Daily Build[called heart beat]
###Daily Build->Object File&Binary File->Deploymened on release server->BVT Automation. ...
- JavaScript Cookies使用
Cookie 是个存储在客户端(浏览器)记录信息确定用户身份的小文本文件,可以用来跟踪用户当前登陆状态和用户浏览页面的次数,记录用户输入的文本信息,也可以在页面间传递变量,记录用户一些行为. 当浏览器 ...
- 移动前端头部标签(HTML5 head meta)转载
移动web页面头部书写 字数2516 阅读1128 评论0 喜欢30 HTTP 标题信息(http-equiv) 和页面描述信息(name) http-equiv:该枚举的属性定义,可以改变服务器和用 ...
- python学习小结
1学习的课程名字叫什么 python:前端初识html,后台基础flask 2怎么输出一句话,用代码举例 输出用:print 例如: 3使用终端工具怎么运行 Python代码 例如我要运行题目2的程序 ...
- Kaggle竞赛顶尖选手经验汇总
What is your first plan of action when working on a new competition? 理解竞赛,数据,评价标准. 建立交叉验证集. 制定.更新计划. ...
- sessionStorage与clone方法在项目中的应用
//资料列表: //JSON.parse(jsonstr); //json格式字符串转换成json对象 //JSON.stringify(jsonobj); //json对象转换成json格式字符串 ...