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了???? 首先,这题完全可以离线做 我们先把所有的操作读完,判断合不合法之后,再去判断和标准答案的关系 具体而言 把所有的操作 ...
随机推荐
- IE浏览器 ajax传参数值为中文时出现乱码的解决方案
找了很多方法,发现就这个方法简单.直接.方便,直接推荐哦! 在汉字的位置加个保护措施:encodeURIComponent(parentid) 举个栗子>>> $.ajax({ ...
- 前端-JS思维导图
看不清的朋友右键保存或者新窗口打开哦!喜欢我可以关注我,还有更多前端思维导图笔记
- c++ 编译期与运行期
分享到 一键分享 QQ空间 新浪微博 百度云收藏 人人网 腾讯微博 百度相册 开心网 腾讯朋友 百度贴吧 豆瓣网 搜狐微博 百度新首页 QQ好友 和讯微博 更多... 百度分享 转自:http://h ...
- python爬虫:爬取凤凰指数
在知乎上看到的这个问题,讲讲我爬取过程中遇到的问题: 1.循环爬取其他页面,在其他项目中用循环一般可以搞定,可是这个,第一页和第二第三页的表格是不同的,所以要重新写规则,我懒,写了第一页后,就不想在写 ...
- 最简单的一致性Hash算法实现
import java.util.Collection;import java.util.SortedMap;import java.util.TreeMap; public class Consis ...
- ZBrush中的PolyPainting如何理解?
什么是PolyPainting? PolyPainting在ZBrush ®中是一种创建纹理的方法,该方法通过对每个多边形顶点应用单一RGB值来着色模型.此方法无需使用UV坐标.通过直接对顶点应用颜色 ...
- web前端学习基础知识(1)
下载Atom插件和主题安装和配置 1.官网 https://atom.io/ 2.百度网盘上http://pan.baidu.com/s/1ntszCgT 安装subline以及插件的安装,再去了解它 ...
- JS棋盘
有一个棋盘,有64个方格,在第一个方格里面放1粒芝麻重量是0.00001kg, 第二个里面放2粒,第三个里面放4,棋盘上放的所有芝麻的重量 <!DOCTYPE html> <html ...
- js进度条插件pace.js
主要用到themes文件夹和pace.js文件
- anaconda下jieba和wordcloud安装
1.在anaconda交互环境下安装jieba,输入命令: pip install jieba 2.在https://pypi.python.org/pypi/wordcloud下载wordclou ...