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 ...
随机推荐
- FCoin API
本文介绍FCoin API 介绍 通过了解以下信息,您可以方便的使用 FCoin 提供的 API 来接入 FCoin 交易平台. 认证 执行下面的代码进行用户验证: import fcoin api ...
- Python 目录【持续更新中】
Python 基础 字符编码 数据类型 文件处理 流程控制 练习题 函数,递归 匿名函数.内置函数 装饰器变形记 函数装饰器 递归 二分法 迭代器和生成器 协程函数 列表表达式 生成器表达式 异常处理 ...
- php 中date显示时间不对与Linux文件乱码问题
php 中date显示时间不对解决办法如下1.修改/etc/php.ini文件 在里头中找到data.timezone =去掉它前面的分号';' 然后设置data.timezone = “Asia/S ...
- PHP消息队列实现及应用_慕课网学习
https://blog.csdn.net/d_g_h/article/details/79643714 https://blog.csdn.net/tTU1EvLDeLFq5btqiK/articl ...
- POJ:2049Finding Nemo(bfs+优先队列)
http://poj.org/problem?id=2049 Description Nemo is a naughty boy. One day he went into the deep sea ...
- pycharm进行调试[转载]
转自:https://blog.csdn.net/william_hehe/article/details/80898031 1.首先设置断点. 2.Step into(F7):进入 若函数A内存在子 ...
- NuGet:自定义配置信息(2)
有些类库项目打包后,如何让别人引用的时候自动添加上对应的配置项目呢,比如EntityFramework的NuGet包,打开后可以看到类似下面的结构: 空白处右击——Add Content Folder ...
- c++虚函数实现机制(转)
前言 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数.这种技术可以让父类的指针有“多种形态”,这是一种泛 ...
- bootstrap modal 垂直居中对齐
bootstrap modal 垂直居中对齐 文章参考 http://www.bubuko.com/infodetail-666582.html http://v3.bootcss.com/Jav ...
- cf463d
这题说的是给了k个串算出这k个串的最长公共子序列,这k个串每个串都是由1--n的数字组成的. 将第一串的数字按照顺序重新编号为123...n 然后后面的串按照这个编号重新标号,就转化为下面每个串大最长 ...