时间复杂度

这道题从两个月前开始做,一直没做出来,最后今晚决心一定要做出来。于是开始认真的在打草纸上写思路,最后在AC的那一刻,差点哭了出来!!

题目大意

这个自己看吧,noip2017的D1T2

solution

先介绍一下这道题我们用到的每个变量他们的用处

  1. stack[]记录变量的循环层
  2. vis[]记录变量在栈中是否出现过
  3. cmp函数,这个可以用作比较循环中a和b的大小

\[\begin{cases}
a<b -> 进入新的一层循环\\
a>b -> 无法进入新的循环,循环终止\\
a=b -> 此循环为o1
\\
\end{cases}
\]

  1. stop 如果循环已经无法进入,那么就用stop计数
  2. ans表示最终的复杂度层数,maxn表示当前一层循环的复杂度层数

    接下来是三种状态的
  3. ERR 条件

\[\begin{cases}
F、E不匹配\\
变量名重复
\\
\end{cases}
\]

  1. 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 时间复杂度(模拟)的更多相关文章

  1. luogu P3952 时间复杂度 模拟

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

  2. luogu 3952 时间复杂度

    noip2017 D1T2 时间复杂度 某zz选手考场上写了1.5h 考完之后发现自己写的是错的 但是结果A了??? 题目大意: 一种新的编程语言 A++ 给出一个程序只有循环语句 并给出这个程序的时 ...

  3. [Luogu 3952] NOIP2017 时间复杂度

    [Luogu 3952] NOIP2017 时间复杂度 一年的时间说长不长,说短,也不短. 一年之内无数次觉得难得可怕的题目,原来也就模拟这么回事儿. #include <cstdio> ...

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

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

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

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

  6. [LUOGU] P3952 时间复杂度

    其实,也没那么难写 这种模拟题,仔细分析一下输入格式,分析可能的情况,把思路写在纸上,逐步求精,注意代码实现 主要思路就是算一个时间复杂度,和给出的复杂度比较,这就先设计一个函数把给出的复杂度由字符串 ...

  7. 计蒜客 时间复杂度 (模拟) & 洛谷 P3952 时间复杂度

    链接 : Here! 思路 : 这是一道大模拟, 区分好情况就没问题了 循环构成部分 : $F , x , i , j$ 和 $E$ , 需要注意的是 $i , j$, - 分析 $i, j$ 的情况 ...

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

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

  9. luoguP3952 [NOIP2017]时间复杂度 模拟

    原本只是想看下多久能码完时间复杂度 然后在30min内就码完了,然后一A了???? 首先,这题完全可以离线做 我们先把所有的操作读完,判断合不合法之后,再去判断和标准答案的关系 具体而言 把所有的操作 ...

随机推荐

  1. 用Navicat自动备份mysql数据库

    以下文章转载自https://blog.csdn.net/u013628152/article/details/54909885,放在自己的博客园以供后面方便查询 —————————————————— ...

  2. VS2015 & ReSharper CTRL

    如下为个人比较常用的快捷键,部分快捷键有进行修改. 一.VS偏好设置: 1.转到定义:F12 2.查找所有引用:Shift + F12 3.跳转到指定的某一行:Ctrl + G (or 单击状态栏中的 ...

  3. Linux VFS分析(二)

    inode的管理:Inode-cache hash表inode_hashtable索引节点缓存 dentry的管理: 我们知道,若干dentry描绘了一个树型的目录结构,这就是用户所看到的目录结构,每 ...

  4. 【ES6】 Promise / await / async的使用

    为什么需要在项目中引入promise? 项目起因:我们在页面中经常需要多次调用接口,而且接口必须是按顺序串联调用 (即A接口调用完毕,返回数据后,再调用B接口) 这样就会造成多次回调,代码长得丑,而且 ...

  5. WPF添加类库并引用

    源码地址:https://github.com/lizhiqiang0204/-WpfApp2.git 首先利用WPF向导创建一个空的项目 using System.Windows; namespac ...

  6. 推荐一款能支持国密SM2浏览器——密信浏览器

    密信浏览器( MeSince Browser )是基于Chromium开源项目开发的国密安全浏览器,支持国密算法和国密SSL证书,同时也支持国际算法及全球信任SSL证书:密信浏览器使用界面清新,干净. ...

  7. tsar源码分析

    从modules/mod_cpu.c入手 ./devel/tsar.h module 结构体: struct module { char name[LEN_32]; char opt_line[LEN ...

  8. git 教程2 (git常用命令解说)

    <1>$ git -- help (调出git的帮助文档) <2>$ git +命令 --help (查看某个具体命令的帮助文档) <3>$ git --versi ...

  9. Project Euler 38 Pandigital multiples

    题意: 将192分别与1.2.3相乘: 192 × 1 = 192192 × 2 = 384192 × 3 = 576 连接这些乘积,我们得到一个1至9全数字的数192384576.我们称192384 ...

  10. sessionStorage与clone方法在项目中的应用

    //资料列表: //JSON.parse(jsonstr); //json格式字符串转换成json对象 //JSON.stringify(jsonobj); //json对象转换成json格式字符串 ...