noip2017 Day1 T2 时间复杂度complexity(栈,模拟)
来源:互联网 发布:网络推广外包合同 编辑:程序博客网 时间:2024/05/17 06:30
题目
描述
小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会来啦!下面请你编写程序来判断小明对他的每个程序给出的时间复杂度是否正确。
A++语言的循环结构如下:
F i x y 循环体E
其中F i x y表示新建变量
“E”表示循环体结束。循环体结束时,这个循环体新建的变量也被销毁。
注:本题中为了书写方便,在描述复杂度时,使用大写英文字母“O”表示通常意义下“Θ”的概念。
输入
输入文件第一行一个正整数
接下来每个程序的第一行包含一个正整数
接下来
程序行若以E开头,则表示循环体结束。
输出
输出文件共
注意:即使在程序不会执行的循环体中出现了语法错误也会编译错误,要输出 ERR。
样例输入
82 O(1)F i 1 1E2 O(n^1)F x 1 nE1 O(1)F x 1 n4 O(n^2)F x 5 nF y 10 nEE4 O(n^2)F x 9 nEF y 2 nE4 O(n^1)F x 9 nF y n 4EE4 O(1)F y n 4F x 9 nEE4 O(n^2)F x 1 nF x 1 10EE
样例输出
YesYesERRYesNoYesYesERR
输入输出样例解释
第一个程序
第二个程序
第三个程序有一个 F 开启循环却没有 E 结束,语法错误。
第四个程序二重循环,
第五个程序两个一重循环,
第六个程序第一重循环正常,但第二重循环开始即终止(因为
第七个程序第一重循环无法进入,故为常数复杂度。
第八个程序第二重循环中的变量
数据规模与约定
对于 30%的数据:不存在语法错误,数据保证小明给出的每个程序的前
对于 50%的数据:不存在语法错误,
对于 70%的数据:不存在语法错误,
对于 100%的数据:
解题思路
由于循环必须要让F与E配对,联想到括号匹配问题,所以用栈来模拟。
为了方便计算,我在栈里维护了三个值,分别表示当前循环所用变量名、程序执行到当前循环时的复杂度、当前循环是否处于被跳过的循环之中(即程序不会执行到)。在压栈时维护一下这三个值就好了,最后的复杂度即为最大的可被执行到的复杂度。
最后,注意一下关于字符串的读入处理就好了。
Code
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;int T, L, kind, w;//kind == 1:O(1); kind == 2: O(n^w)int top, ans;char com[100], opt[100];bool used[1000], err;struct Node{ char ch; int c;//执行至此的时间复杂度 bool dir;//是否处于直接跳过的循环中 }sta[1000];void solve(){ scanf("%d ", &L); cin.getline(com, 99); if(com[2] == '1') kind = 1; else{ int now = 4; while(com[now] >= '0' && com[now] <= '9'){ w = w * 10 + com[now] - '0'; now++; } kind = 2; } for(int i = 1; i <= L; i++){ cin.getline(opt, 99); if(err) continue; if(opt[0] == 'F'){ if(used[opt[2]]){ err = 1; continue; } used[opt[2]] = 1; int now = 4, l = 0, r = 0, pre = 0, nxt = 0; while((opt[now] >= '0' && opt[now] <= '9') || opt[now] == 'n'){ if(opt[now] == 'n') pre = 1; else l = l * 10 + opt[now] - '0'; now++; } now++; while((opt[now] >= '0' && opt[now] <= '9') || (opt[now] == 'n')){ if(opt[now] == 'n') nxt = 1; else r = r * 10 + opt[now] - '0'; now++; } if(pre == 1 && nxt == 1){ sta[top+1] = (Node){opt[2], sta[top].c, sta[top].dir}; top++; if(sta[top].dir == 0) ans = max(ans, sta[top].c); } else if(pre == 1 && nxt == 0){ sta[top+1] = (Node){opt[2], sta[top].c, 1}; top++; } else if(pre == 0 && nxt == 1){ sta[top+1] = (Node){opt[2], sta[top].c + 1, sta[top].dir}; top++; if(sta[top].dir == 0) ans = max(ans, sta[top].c); } else if(pre == 0 && nxt == 0){ if(l <= r){ sta[top+1] = (Node){opt[2], sta[top].c, sta[top].dir}; top++; if(sta[top].dir == 0) ans = max(ans, sta[top].c); } else{ sta[top+1] = (Node){opt[2], sta[top].c, 1}; top++; } } } else if(opt[0] == 'E'){ if(top == 0) err = 1; else{ used[sta[top].ch] = 0; top--; } } } if(top) err = 1; if(err){ puts("ERR"); return; } if(kind == 1 && ans == 0){ puts("Yes"); return; } if(kind == 2 && w == ans){ puts("Yes"); return; } puts("No"); return;}void init(){ memset(sta, 0, sizeof sta); top = 0; memset(com, 0, sizeof com); memset(opt, 0, sizeof opt); memset(used, 0, sizeof used); err = 0; ans = 0; kind = w = 0;}int main(){ scanf("%d", &T); while(T--){ init(); solve(); } return 0;}
- noip2017 Day1 T2 时间复杂度complexity(栈,模拟)
- POJ 1472:Instant Complexity 模拟时间复杂度
- 【NOIP2017】时间复杂度
- NOIP2017 D1T2 时间复杂度
- 圈复杂度(Cyclomatic Complexity)
- mNOIP 模拟赛 day1 T2 数颜色
- NOIP2017图书管理员(普及T2)
- 【NOIP 模拟题】[山东多校联合模拟赛 day1 T2] 祖先(dp)
- NOIP2017赛前模拟 STAR (合理证明复杂度)
- NOIP2017模拟day1 T3 string splay 置换
- [字符串HASH][复杂度分析] NOI2017 .Day1 T2 蚯蚓排队
- NOIP 2017 Day1 题2: 时间复杂度 栈
- 什么是Cyclomatic Complexity(圈复杂度)?
- 【NOIP2017】Day1
- NOIP2017 Day1
- AtCoder AGC001F Wide Swap && NOIP2017模拟赛10.8T2
- Noip提高组 2014 Day1 T2 联合权值 模拟
- JZOJsenior5474.【NOIP2017提高组】day1T2时间复杂度
- java选择排序
- 依葫芦画瓢,使用CoordinatorLayout后不能滑动
- 机器学习笔记(八) 神经网络的表示
- 漂亮的课表控件-TimetableView
- Python学习1
- noip2017 Day1 T2 时间复杂度complexity(栈,模拟)
- 练习
- Nagle 算法和 Silly Window Syndrome
- ZOJ
- 白话算法之【动态规划入门】
- 操作系统基础知识总结
- iOS视频转码 mov 转 mp4
- CGLIB动态代理
- Go select 语句