P3952 NOIP2017 时间复杂度
写了两三个小时,麻烦倒是不麻烦,要考虑清楚,想全了
只过了样例提交是不是傻,要自己造数据
数据不大可以用STL
建议自己刚一下,不看代码
#include <iostream>
#include <stack>
#include <cstring>
#include <cstdio>
using namespace std;
int n;
char a[200][200];
int fuzadu;
int vis[30];
struct node {
int zimu,id,fzd;
node(int a,int b,int c) {
zimu=a;id=b;fzd=c;
}
//zimu是最后用来删除的,id是check弹栈用的 ,fzd是判断这个F是否能有贡献,是不是O(n)的
};
stack<node> sta;
void read()
{
while(!sta.empty()) sta.pop();
memset(a,0,sizeof(a));
memset(vis,0,sizeof(vis));
scanf("%d O(",&n);
char s=getchar();
if(s=='n') {
scanf("^%d)",&fuzadu);
} else fuzadu=0;
while(s!='\n')s=getchar();
for(int i=1;i<=n;++i)
cin.getline(a[i]+1,'\n');
}
bool check(int &i,int dsr)
{
++i;
for(;i<=n;++i)
{
if(a[i][1]=='F') //F
{
//处理 循环变量
if(vis[a[i][3]-'a']) { //如果出现过的话,ERR
return 1;
} else {
vis[a[i][3]-'a']=1; //vis数组++
sta.push(node(a[i][3]-'a',i,0));//加入栈
}
} else { //E
if(a[i][1]=='E') { //如果结束这个循环
if(sta.empty()) { return 1;}//没有对应的F,ERR
vis[sta.top().zimu]=0;// 这个F的字母以后可以用了
if(sta.top().id==dsr) {
sta.pop();return 0;
}
sta.pop(); //在栈中删除
}
}
}
return 0;
}
void solve()
{
read();
int js=0;//时间复杂度
int ans=0;//最大复杂度
for(int i=1;i<=n;++i)
{
if(a[i][1]=='F') //F
{
//处理 循环变量
if(vis[a[i][3]-'a']) { //如果出现过的话,ERR
{ puts("ERR");return;}
} else {
vis[a[i][3]-'a']=1; //vis数组++
}
//F的范围
int j=5,x=0,y=0;
if(a[i][5]=='n') {
sta.push(node(a[i][3]-'a',i,0));//一定不可能是复杂度一定不可能是O(1)的
//如果第一个数是n,那么只有第二个数也是n才能进入循环(复杂度O(1)),否则就直到弹栈为止
if(a[i][7]!='n') { //只需要检查是否ERR即可
if(check(i,i)) {
puts("ERR");return;
}
}
} else {
while(a[i][j]>='0'&&a[i][j]<='9') {x=x*10+a[i][j]-'0';j++;} j++;//读入x
if(a[i][j]=='n') {
sta.push(node(a[i][3]-'a',i,1));
js++;//如果第1个是数字第2个是n,复杂度++
ans=max(ans,js); //更新最高复杂度
}
else {
sta.push(node(a[i][3]-'a',i,0));
while(a[i][j]>='0'&&a[i][j]<='9') {y=y*10+a[i][j]-'0';j++;} j++;
//如果都是数字,分为可以进入和不可以进入
if(x>y) {//不可以进//只需要检查是否ERR即可入
if(check(i,i)) {
puts("ERR");return;
}
}
//可以进入就不管啦,复杂度O(1)
}
}
} else {
//处理E
if(a[i][1]=='E') { //如果结束这个循环
if(sta.empty()) { puts("ERR");return;}//没有对应的F,ERR
vis[sta.top().zimu]=0;// 这个F的字母以后可以用了
js-=sta.top().fzd;//这个复杂度也得--,所以要过程中取max
sta.pop(); //在栈中删除
}
}
}
if(sta.size())
puts("ERR");
else if(ans==fuzadu)
puts("Yes");
else puts("No");
}
int main()
{
// freopen("a.in","r",stdin);
int T;
scanf("%d",&T);
while(T--)
solve();
return 0;
}
P3952 NOIP2017 时间复杂度的更多相关文章
- 【比赛】NOIP2017 时间复杂度
恶心的模拟题,考场上犯了一堆错误,多组数据清空没清完.数组开小...民间都是50分,结果CCF90.. 考完后随便改改就过了,还好只少了10分,如果真的是50,我估计会疯掉. 因为考场的时候没写好,所 ...
- [Luogu 3952] NOIP2017 时间复杂度
[Luogu 3952] NOIP2017 时间复杂度 一年的时间说长不长,说短,也不短. 一年之内无数次觉得难得可怕的题目,原来也就模拟这么回事儿. #include <cstdio> ...
- 【洛谷P3952】[NOIP2017]时间复杂度
时间复杂度 题目链接 对于 100%的数据:L≤100 . 很明显的模拟题 然而考试时还是爆炸了.. 调了一下午.. 蒟蒻表示不会离线操作.. 直接贴代码: #include<cstdio> ...
- NOIP2017 时间复杂度 大模拟
再写一道大模拟题. 由于是限时写的,相当于考场代码,乱的一批. 题目链接:P3952 时间复杂度 先记几个教训: 字符串形式的数字比较大小老老实实写函数,字典序都搞错几次了 栈空的时候不但pop()会 ...
- 【 P3952】 时间复杂度 大模拟题解
题目链接 完全模拟 1.模拟结果 当我们的模拟程序执行结束时,直接执行模拟结果函数,用于比对我们的结果和数据给出的结果. bool yes(char a[],char b[]) { ;i<=;+ ...
- luoguP3952 [NOIP2017]时间复杂度 模拟
原本只是想看下多久能码完时间复杂度 然后在30min内就码完了,然后一A了???? 首先,这题完全可以离线做 我们先把所有的操作读完,判断合不合法之后,再去判断和标准答案的关系 具体而言 把所有的操作 ...
- [NOIP2017]时间复杂度
题目描述 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会来啦!下面请你编写程序 ...
- 【题解】洛谷P3952 [NOIP2017TG] 时间复杂度(模拟)
题目来源:洛谷P3952 思路 纯模拟没啥可说的了 果然好复杂 参考了你谷一个40行代码 代码 #include<iostream> #include<cstdio> #inc ...
- 【题解】NOIP2017时间复杂度
对大模拟抱有深深的恐惧……不过这次写好像还好?拿个栈维护一下循环的嵌套,然后重定义一下读入即可.记得去年在考场上面死活调不粗来,代码也奇丑无比……希望今年能好一点吧! #include <bit ...
随机推荐
- 学习计划 mysql 主从复制
网上资料繁多,需要跳多少坑才能实现,跳跳就知道了. -- 主从复制 如题:主数据库进行的操作,从数据库进行备份. -- 原理 有关于这方面的原理网上也是一搜一大片,去看看吧.肯定没错. 这里简单说一下 ...
- 《Mysql 索引》
一:索引概述? - 数据库里的数据是以文件的形式存储的,里面放了我们的各种数据.就和一本书一样. - 通俗的来说,索引就像一个书签一样,可以直接帮我们找到内容,避免了我们一页一页找. - 就像你不会给 ...
- Celery 分布式任务队列入门
一.Celery介绍和基本使用 Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery ...
- Core Data with Mantle
Mantle makes it easy to write a simple model layer for your Cocoa or Cocoa Touch application. Mantl ...
- [py]pycharm远程环境添加
pycharm配置settings.jar pycharm远程环境调用.zip xadmin xadmin-django2 pycharm激活 最新2018.2激活---更新2018年8月8日 15: ...
- servlet07
1.session验证 可以防止非登录的用户,通过在地址栏中输入地址,访问受保护的页面 step1.在用户登录成功之后,将用户的信息保存到session中 step2.在访问受保护的页面时,校验ses ...
- [转]C语言四书五经
我们来说说C语言方面的图书.什么,C语言?有读者奇怪了.没错,这一次的主角就是诞生于1973年如今已经儿孙满堂的C语言.我们之所以要谈及C,不仅仅是因为它的影响深远,这完全可以从C系列语言家族的兴旺发 ...
- 禁止F12与右键
实践项目的代码哦,给大家分享下,如何屏蔽右键与F12. 应用网站 www.empiretreasure.vip 与 www.MineBook.vip.可以去逛逛哦. 不多说了,上代码 ...
- VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
上一节讲了标签控件Tab Control以后,常用控件的内容就全部讲完了,当然并没有包括所有控件,主要是一些很常用很重要的控件.本节开始鸡啄米将为大家讲解菜单的概念及使用. 菜单简介 菜单在界面设计中 ...
- Linux基础命令---sum,cksum
cksum 检查文件的crc是否正确,统计文件的字节数. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora. 1.语法 cks ...