【 P3952】 时间复杂度 大模拟题解
完全模拟
1.模拟结果
当我们的模拟程序执行结束时,直接执行模拟结果函数,用于比对我们的结果和数据给出的结果。
bool yes(char a[],char b[])
{
for(int i=;i<=;++i)
if(a[i]!=b[i])
return ;
return ;
}
void print()
{
memset(o,,sizeof(o));
if((no1==&&mk==)||(mk==)){o[]='O';o[]='(';o[]='';o[]=')';}
else
{
int mi1,mi10=;
mi1=mk%;
if(mk>=)
{mi10=mk/;o[]='O';o[]='(';o[]='n';o[]='^';o[]=mi10+'';o[]=mi1+'';o[]=')';}
else
{o[]='O';o[]='(';o[]='n';o[]='^';o[]=mi1+'';o[]=')';}
}
if(error){cout<<"ERR"<<endl;return;}
if(yes(o,ok)){cout<<"Yes"<<endl;}
else{cout<<"No"<<endl;}
}
其中mi1储存的是时间复杂度
o是我们结果的模拟,模拟出o(mi1)
ok是数据输入的时间复杂度
2.模拟读入过程
void F(char,int,int,bool);
void read()
{
char ii,xx[],yy[];
memset(xx,,sizeof(xx));
memset(yy,,sizeof(yy));
cin>>ii>>xx>>yy;
int x,y;
int lenx=strlen(xx);
int leny=strlen(yy);
if(xx[]=='n'&&yy[]!='n')
{
x=;
if(leny==)y=(yy[]-'')*+(yy[]-'');
else y=(yy[]-'');
F(ii,x,y,);
}
else if(xx[]!='n'&&yy[]=='n')
{
if(lenx==)x=(xx[]-'')*+(xx[]-'');
else x=(xx[]-'');
y=;
F(ii,x,y,);
}
else
{
if(leny==)y=(yy[]-'')*+(yy[]-'');
else y=(yy[]-'');
if(lenx==)x=(xx[]-'')*+(xx[]-'');
else x=(xx[]-'');
F(ii,x,y,);
no1=;
} }
运用递归方法,对于输入的 F i j x只有三种情况。
(1) F i n x
时间复杂度要乘以n,所以直接模拟
(2) F n j x
由于n>j,之后的循环嵌套其实进不去,接下来要模拟一个上锁的过程
(3) F i j x
常数级
3.模拟程序执行过程
int main()
{
cin>>t;
for(int i=;i<=t;++i)
{
mk=;m=;fm=;error=;no1=;unlock=;
memset(ok,,sizeof(ok));
marki.erase(marki.begin(),marki.end());
cin>>l;
cin>>ok;
while(l!=)
{
mi=;
unlock=;
cin>>ht;
if(ht=='F')
{
read();
}
else if(ht=='E')
{
error=;
l--;
}
}
if(fm!=)
{
error=;
}
print(); }
return ;
}
主函数中输入过程每一个小程序都输入一遍
用一个map来存变量x的使用情况
当判到F时进行读入,在F()函数中会判E
所以在主函数中当判到E时直接跳error,一定要记得l--
void F(char i,int x,int y,bool o1)
{
if(l==)
{
error=;
}l--; if(marki[i]==)
{
error=;
}
marki[i]=;
if(fm!=&&fm==mi)
{unlock=;}
if(o1!=){m++;}fm++; if(x>y)
{unlock=;}
if(unlock)mi=max(m,mi);
while(l!=)
{
cin>>ht;
if(ht=='F')
{
read();
}
else if(ht=='E')
{
l--;
if(o1!=)
{
m--;
}
fm--;
if(m==)
{
mk=max(mi,mk);
mi=;
}
marki.erase(i);
return;
}
}
}
其中的error就是各个错误过程,用了一个unlock去锁住进不去的循环
用了m去存实际除去进入循环的层数,用mi去每次取出
用了fm去存包括进不去的循环在内的层数
当fm回到锁前的mi时解锁
完整代码
#include<iostream>
#include<cstdio>
#include<map>
#include<stack>
#include<cstring>
using namespace std;
map<char,bool>marki;
bool error;
int m,fm;
int mi,mk;
bool no1;
char o[];
char ok[];
int t,l;
char ht;
char I;
int X,Y;
bool unlock;
bool yes(char a[],char b[])
{
for(int i=;i<=;++i)
if(a[i]!=b[i])
return ;
return ;
}
void F(char,int,int,bool);
void read()
{
char ii,xx[],yy[];
memset(xx,,sizeof(xx));
memset(yy,,sizeof(yy));
cin>>ii>>xx>>yy;
int x,y;
int lenx=strlen(xx);
int leny=strlen(yy);
if(xx[]=='n'&&yy[]!='n')
{
x=;
if(leny==)y=(yy[]-'')*+(yy[]-'');
else y=(yy[]-'');
F(ii,x,y,);
}
else if(xx[]!='n'&&yy[]=='n')
{
if(lenx==)x=(xx[]-'')*+(xx[]-'');
else x=(xx[]-'');
y=;
F(ii,x,y,);
}
else
{
if(leny==)y=(yy[]-'')*+(yy[]-'');
else y=(yy[]-'');
if(lenx==)x=(xx[]-'')*+(xx[]-'');
else x=(xx[]-'');
F(ii,x,y,);
no1=;
} }
void F(char i,int x,int y,bool o1)
{
if(l==)
{
error=;
}l--; if(marki[i]==)
{
error=;
}
marki[i]=;
if(fm!=&&fm==mi)
{unlock=;}
if(o1!=){m++;}fm++; if(x>y)
{unlock=;}
if(unlock)mi=max(m,mi);
while(l!=)
{
cin>>ht;
if(ht=='F')
{
read();
}
else if(ht=='E')
{
l--;
if(o1!=)
{
m--;
}
fm--;
if(m==)
{
mk=max(mi,mk);
mi=;
}
marki.erase(i);
return;
}
}
}
void print()
{
memset(o,,sizeof(o));
if((no1==&&mk==)||(mk==)){o[]='O';o[]='(';o[]='';o[]=')';}
else
{
int mi1,mi10=;
mi1=mk%;
if(mk>=)
{mi10=mk/;o[]='O';o[]='(';o[]='n';o[]='^';o[]=mi10+'';o[]=mi1+'';o[]=')';}
else
{o[]='O';o[]='(';o[]='n';o[]='^';o[]=mi1+'';o[]=')';}
}
if(error){cout<<"ERR"<<endl;return;}
if(yes(o,ok)){cout<<"Yes"<<endl;}
else{cout<<"No"<<endl;}
}
int main()
{
cin>>t;
for(int i=;i<=t;++i)
{
mk=;m=;fm=;error=;no1=;unlock=;
memset(ok,,sizeof(ok));
marki.erase(marki.begin(),marki.end());
cin>>l;
cin>>ok;
while(l!=)
{
mi=;
unlock=;
cin>>ht;
if(ht=='F')
{
read();
}
else if(ht=='E')
{
error=;
l--;
}
}
if(fm!=)
{
error=;
}
print(); }
return ;
}
Code
【 P3952】 时间复杂度 大模拟题解的更多相关文章
- NOIP2017 时间复杂度 大模拟
再写一道大模拟题. 由于是限时写的,相当于考场代码,乱的一批. 题目链接:P3952 时间复杂度 先记几个教训: 字符串形式的数字比较大小老老实实写函数,字典序都搞错几次了 栈空的时候不但pop()会 ...
- 2018.11.02 洛谷P3952 时间复杂度(模拟)
传送门 惊叹考场dubuffdubuffdubuff. 这题还没有梭哈难啊233. 直接按照题意模拟就行了. 代码: #include<bits/stdc++.h> using names ...
- 洛谷 P3952 时间复杂度【模拟】
把No写成NO,WA了一发-- 现在看这题也不难-- 用一个栈,记一下前面F的字母,是否合法,合法的有多长,每次入栈弹栈即可 #include<iostream> #include< ...
- 【题解】洛谷P3952 [NOIP2017TG] 时间复杂度(模拟)
题目来源:洛谷P3952 思路 纯模拟没啥可说的了 果然好复杂 参考了你谷一个40行代码 代码 #include<iostream> #include<cstdio> #inc ...
- luogu P3952 时间复杂度 模拟
题目链接 luogu P3952 时间复杂度 题解 直接模拟即可 注意不要直接return 我真是naive ...... 代码 #include<map> #include<sta ...
- 计蒜客 时间复杂度 (模拟) & 洛谷 P3952 时间复杂度
链接 : Here! 思路 : 这是一道大模拟, 区分好情况就没问题了 循环构成部分 : $F , x , i , j$ 和 $E$ , 需要注意的是 $i , j$, - 分析 $i, j$ 的情况 ...
- Bzoj1972: [Sdoi2010]猪国杀 题解(大模拟+耐心+细心)
猪国杀 - 可读版本 https://mubu.com/doc/2707815814591da4 题目可真长,读题都要一个小时. 这道题很多人都说不可做,耗时间,代码量大,于是,本着不做死就不会死的精 ...
- [CSP-S模拟测试]:引子(大模拟)
题目描述 网上冲浪时,$Slavko$被冲到了水箱里,水箱由上而下竖直平面.示意图如下: 数字$i$所在的矩形代表一个编号为$i$的水箱.1号水箱为水箱中枢,有水管连出.除了$1$号水箱外,其他水箱上 ...
- HDU 5920 Ugly Problem 高精度减法大模拟 ---2016CCPC长春区域现场赛
题目链接 题意:给定一个很大的数,把他们分为数个回文数的和,分的个数不超过50个,输出个数并输出每个数,special judge. 题解:现场赛的时候很快想出来了思路,把这个数从中间分为两部分,当位 ...
随机推荐
- 服务器告警其一:硬盘raid问题
问题描述 服务器一直间断发出告警音,但是根据raid类型的不同有一定可能进入系统. 问题详情 在LSI Mega Webbios自检之后系统开始出现告警音. 在Lsi Mega Webbios的ini ...
- 接触node第一步
趁着工作不忙,今天来系统记录一下安装node环境: 1.node下载地址为:https://nodejs.org/en/,检查是否安装成功:如果输出版本号,说明我们安装node环境成功:node -v ...
- VB代码收集
1.随机获取5位验证码? 需求: 创建一个Label1:名称为随机验证码生成 创建一个Label2:名称为为空,属性BorderStyle=1 创建一个CommandButton:名称为获取随机码 代 ...
- 【题解】Luogu P4438 [HNOI/AHOI2018]道路
原题传送门 实际就是一道简单的树形dp 设f[u][i][j]表示从根结点到结点u经过i条未翻修公路,j条未翻修铁路的贡献最小值 边界条件:f[leaf][i][j]=(A+i)(B+j)C (题目上 ...
- 王之泰201771010131《面向对象程序设计(java)》第十七周学习总结
第一部分:理论知识学习部分 第14章 并发 线程同步 多线程并发运行不确定性问题解决方案:引入线 程同步机制,使得另一线程要使用该方法,就只 能等待. ⚫ 在Java中解决多线程同步问题的方法有两种: ...
- git忽略对已入库文件的修改
项目开发过程中,会遇到本地配置文件每个开发人员不同的情况,但如果遇到类似数据库配置这种最终需要加入 git 版本控制的配置,则会陷入两难境地.要么不跟踪,要么有人提交后其他人同步下来必须手动修改,非常 ...
- Mybatis学习之一
mybatis是目前市面上最流行的ORM框架之一,作为JavaEE程序员,在工作中不可能不用到mybatis.所以为了工作,为了学习,为了个人的发展,每个JavaEE程序员都要学习,学会mybatis ...
- curl 向远程服务器传输file文件
public function upload(){ //获取上传文件信息,文件名称以自己实际上传文件名称为准 $fileinfo = $_FILE['filename']; //请求参数,依据商户自己 ...
- kali虚拟机添加共享文件夹
1.保证安装了vmtools 2.在虚拟机本身设置共享文件夹,如图 其中选的这个文件夹就是宿主机里待共享的文件夹. 3,在kali里启用它: vmhgfs-fuse .host:[宿主机文件夹] /m ...
- JedisPubSub
MsgListener extends JedisPubSub notify-keyspace-events "KEA"