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了???? 首先,这题完全可以离线做 我们先把所有的操作读完,判断合不合法之后,再去判断和标准答案的关系 具体而言 把所有的操作 ...
随机推荐
- Codeforces Round #449
960 asteri 1384 492 00:04 -1 892 01:33 960 PEPElotas 1384 488 00:06 896 00:26 960 ...
- css简单介绍
css层叠样式表,主要作用就是解决内容与表现分离的问题.html标签有自己的意义当然也是有自己的默认样式的,但有时候我们想修改他的样式,这时候就需要了css. 例:给字体加上颜色,我们有如下几种方法: ...
- 错误:android.util.SuperNotCalledException
android.util.SuperNotCalledException: Activity {…….YouTubePlayActivity} did not call through to supe ...
- 管窥python语法
刚接触python,mark下所见所得: 1.Python调用底层API,可在任何platform上运行,包括Windows.Mac.Unix: 2.用#符号对代码或语句进行注释,#后的代码不被编译: ...
- C# 取web应用程序运行目录
HttpRuntime.AppDomainAppPath
- 图片放大不失真软件PhotoZoom如何使用?
PhotoZoom可以将我们一些过于像素低的照片可以无失真放大,那么PhotoZoom是如何实现无失真照片放大的呢? 以上图像中的编号表示每个步骤应操作的位置. 单击“打开”,并选择您想调整大小的图像 ...
- 使用jQuery和CSS自定义HTML5 Video 控件 简单适用
Html5 Video是现在html5最流行的功能之一,得到了大多数最新版本的浏览器支持.包括IE9,也是如此.不同的浏览器提供了不同的原生态浏览器视频空间.我们制作自定义视频控件为了在所有的浏览器中 ...
- BZOJ 3456: 城市规划 多项式求逆
Description 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了. 刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一些贸易路线, 使得整个国家的任意两个城市都直接 ...
- 原生ajax的get和post方法封装
get 方法 function serialize (data) { if (!data) { return ''; } var paris = []; for (var key in data) { ...
- Selenium+Python+jenkins搭建web自动化测测试框架
python-3.6.2 chrome 59.0.3071.115 chromedriver 2.9 安装python https://www.python.org/downloads/ (Wind ...