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了???? 首先,这题完全可以离线做 我们先把所有的操作读完,判断合不合法之后,再去判断和标准答案的关系 具体而言 把所有的操作 ...
随机推荐
- Git Learning Part III - working remotely (Github)
help document of Github : https://help.github.com/ 1 upload 1.1 new update Initialize a repository ...
- 高德地图开发之获取SHA1码
通过Android Studio获取SHA1 第一步.打开 Android Studio 的 Terminal 工具. 第二步.输入命令:keytool -v -list -keystore key ...
- 关于Eclipse安装Scala插件不显示
关于Eclipse安装Scala插件不显示, 改变java版本仍然不能使用, 办法还是有的:下载Eclipse Scala版本 解压使用 下载在这里:http://scala-ide.org/down ...
- ZBrush关于遮罩的一些操作
本文讨论使用ZBrush®软件如何在屏幕上创建遮罩和操纵遮罩. 1. 绘制遮罩 按下Ctrl键你就能够在你的模型上绘制遮罩(笔刷的笔划的开始和结束都必须在模型上),默认情况下,遮罩区域在模型上显示为一 ...
- hdu5676 ztr loves lucky numbers(dfs)
链接 ztrloveslucky numbers 题意 定义幸运数为:只存在4和7且4和7数量相等的数,给出n,求比>=n的最小幸运数 做法 暴力搜出所有长度从2-18的幸运数,因为最多9个4, ...
- 反射API提供的常用类和函数
ReflectionParameter 取回了函数或方法参数的相关信息. {//要自行检查函数的参数,首先创建一个 ReflectionFunction 或 ReflectionMethod 的 实例 ...
- Be born
2018-07-22 16:22:03 Cherry is being greater and greater!
- linux 遇到(vsftpd)—500 OOPS:chroot
今天在用vsftpd 时出现一个问题: 500 OOPS:chroot 解决办法: 1.关闭SELINUX [root@localhost ~]#vi /etc/sysconfig/selinux # ...
- python第二周:数据类型、列表、字典
1.模块初识: sys模块: import sys print(sys.path) #path打印环境变量--> ['F:\\python学习\\projects\\s14\\day2', 'F ...
- nyoj 2 括号配对问题水
#include<stdio.h> #include<stack> #include<string.h> #define N 11000 using namesp ...