P3952 [NOIP2017 提高组] 时间复杂度————C++

目录

  • [NOIP2017 提高组] 时间复杂度
    • 题目背景
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 提示
  • 解题思路
  • Code
  • 运行结果

[NOIP2017 提高组] 时间复杂度

题目背景

NOIP2017 提高组 D1T2

题目描述

小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会来啦!下面请你编写程序来判断小明对他的每个程序给出的时间复杂度是否正确。

A++语言的循环结构如下:

F i x y循环体
E

其中F i x y表示新建变量 i i i(变量 i i i 不可与未被销毁的变量重名)并初始化为 x x x, 然后判断 i i i y y y 的大小关系,若 i i i 小于等于 y y y 则进入循环,否则不进入。每次循环结束后 i i i 都会被修改成 i + 1 i +1 i+1,一旦 i i i 大于 y y y 终止循环。

x x x y y y 可以是正整数( x x x y y y 的大小关系不定)或变量 n n n n n n 是一个表示数据规模的变量,在时间复杂度计算中需保留该变量而不能将其视为常数,该数远大于 100 100 100

E 表示循环体结束。循环体结束时,这个循环体新建的变量也被销毁。

注:本题中为了书写方便,在描述复杂度时,使用大写英文字母 O ⁡ \operatorname O O 表示通常意义下 Θ Θ Θ 的概念。

输入格式

输入文件第一行一个正整数 t t t,表示有 t t t t ≤ 10 t \le 10 t10)个程序需要计算时间复杂度。 每个程序我们只需抽取其中 F i x yE 即可计算时间复杂度。注意:循环结构允许嵌套。

接下来每个程序的第一行包含一个正整数 L L L 和一个字符串, L L L 代表程序行数,字符串表示这个程序的复杂度,O(1) 表示常数复杂度,O(n^w) 表示复杂度为 n w n^w nw,其中 w w w 是一个小于 100 100 100 的正整数,输入保证复杂度只有 O(1)O(n^w) 两种类型。

接下来 L L L 行代表程序中循环结构中的F i x y或者 E。 程序行若以F开头,表示进入一个循环,之后有空格分离的三个字符(串)i x y, 其中 i i i 是一个小写字母(保证不为 n n n),表示新建的变量名, x x x y y y 可能是正整数或 n n n ,已知若为正整数则一定小于 100 100 100

程序行若以E开头,则表示循环体结束。

输出格式

输出文件共 t t t 行,对应输入的 t t t 个程序,每行输出 YesNo 或者 ERR,若程序实际复杂度与输入给出的复杂度一致则输出 Yes,不一致则输出 No,若程序有语法错误(其中语法错误只有: ① FE 不匹配 ②新建的变量与已经存在但未被销毁的变量重复两种情况),则输出 ERR

注意:即使在程序不会执行的循环体中出现了语法错误也会编译错误,要输出 ERR

样例 #1

样例输入 #1

8
2 O(1)
F i 1 1
E
2 O(n^1)
F x 1 n
E
1 O(1)
F x 1 n
4 O(n^2)
F x 5 n
F y 10 n
E
E
4 O(n^2)
F x 9 n
E
F y 2 n
E
4 O(n^1)
F x 9 n
F y n 4
E
E
4 O(1)
F y n 4
F x 9 n
E
E
4 O(n^2)
F x 1 n
F x 1 10
E
E

样例输出 #1

Yes
Yes
ERR
Yes
No
Yes
Yes
ERR

提示

【输入输出样例解释 1 1 1

第一个程序 i i i 1 1 1 1 1 1 是常数复杂度。

第二个程序 x x x 1 1 1 n n n n n n 的一次方的复杂度。

第三个程序有一个 F 开启循环却没有 E 结束,语法错误。

第四个程序二重循环, n n n 的平方的复杂度。

第五个程序两个一重循环, n n n 的一次方的复杂度。

第六个程序第一重循环正常,但第二重循环开始即终止(因为 n n n 远大于 100 100 100 100 100 100 大于 4 4 4)。

第七个程序第一重循环无法进入,故为常数复杂度。

第八个程序第二重循环中的变量 x x x 与第一重循环中的变量重复,出现语法错误②,输出 ERR

【数据规模与约定】

对于 30 % 30\% 30% 的数据:不存在语法错误,数据保证小明给出的每个程序的前 L / 2 L/2 L/2 行一定为以 F 开头的语句,第 L / 2 + 1 L/2+1 L/2+1 行至第 L L L 行一定为以 E 开头的语句, L ≤ 10 L \le 10 L10,若 x x x y y y 均为整数, x x x 一定小于 y y y,且只有 y y y 有可能为 n n n

对于 50 % 50\% 50% 的数据:不存在语法错误, L ≤ 100 L \le 100 L100,且若 x x x y y y 均为整数, x x x 一定小于 y y y, 且只有 y y y 有可能为 n n n

对于 70 % 70\% 70% 的数据:不存在语法错误, L ≤ 100 L \le 100 L100

对于 100 % 100\% 100% 的数据: L ≤ 100 L \le 100 L100


如果需要Hack请私信@zhouyonglong或发讨论,提供数据和能Hack掉的本题的AC记录。

解题思路

  • 模拟。

Code

#include<cstdio>
#include<vector>
#include<string>
#include <iostream>
#include <map>
#include <stack>
#include<sstream>using namespace std;int l;
string o;void solve() {// 输入数据cin >> l >> o;map<char, bool> vis;string s;cin.ignore();vector<string> a;for (int i = 1; i <= l; i++) {getline(cin, s);a.push_back(s);}// 核心过程int f = 0, e = 0;stack<char> st;for (int i = 0; i < a.size(); i++) {s = a[i];// 如果程序不是Eif (s.size() > 3) {// 并且变量名字已经用过了if (vis[s[2]]) {cout << "ERR\n";return;}// 否则,标记一下,压入栈里面vis[s[2]] = 1;st.push(s[2]); // 压入栈}// 统计F和E的数量,因为F和E可以一对消除if (s[0] == 'F') f++;if (s[0] == 'E') {e++;if (!st.empty()) { // 销毁变量名char top = st.top();vis[top] = 0;st.pop();}}}if (f != e) { // F和E不匹配cout << "ERR\n";return;}long long sum = 0, mi = 0;bool flag = false;for (int i = 0; i < a.size(); i++) {s = a[i];// 提取循环中的x和y,由于x和y不一定为1位数,故需要切片提取if (s.size() != 1) {int pos = s.find(' ', 4);string x = s.substr(4, pos - 4);string y = s.substr(pos + 1);// x和y都是数字的情况if (x.find('n') == -1 && y.find('n') == -1) {if (atoi(x.c_str()) > atoi(y.c_str())) flag = 1;}// x为n,y为数字的情况else if (x == "n" && y != "n") flag = 1;// x为数字,y为n的情况。else if (y == "n" && x != "n") {  // 这层循环有可能会执行,因为有可能上层循环已经pass掉了,这层即便没错误也不能执行。if (!flag) mi++;}// 更新幂数sum = max(sum, mi);}// 碰到E的情况else {mi--;if (mi < 0)mi = 0;flag = 0; // 重置}  }// 常数的时间复杂度的情况if (sum == 0) {if (o == "O(1)") cout << "Yes\n";else cout << "No\n";}else {// 通过字符串的切片判断计算的幂数是否和给的幂数一致int cur = o.find(')');string a = o.substr(4, cur - 4);if (sum == stoi(a)) cout << "Yes\n";else cout << "No\n";}}int main() {int t;cin >> t;while (t--) solve();return 0;
}

运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/415946.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多测师肖sir___ui自动化测试po框架(升级)

ui自动化测试po框架&#xff08;升级&#xff09; po框架 一、ui自动化po框架介绍 &#xff08;1&#xff09;PO是Page Object的缩写&#xff08;pom模型&#xff09; &#xff08;2&#xff09;业务流程与页面元素操作分离的模式&#xff0c;可以简单理解为每个页面下面都有一…

西瓜书读书笔记整理(十一) —— 第十一章 特征选择与稀疏学习

第十一章 特征选择与稀疏学习 11.1 子集搜索与评价11.1.1 基本概念11.1.2 为什么要进行特征选择11.1.3 特征选择的两个关键环节11.1.4 常见的特征选择方法11.1.5 其他问题 11.2 过滤式选择11.2.1 什么是过滤式选择方法11.2.2 过滤式选择的优缺点 11.3 包裹式选择11.3.1 什么是包…

定时关机应用V2.1

# 在ShutDown_2.0的基础上&#xff0c;作了如下改进&#xff1a; # 1) 修正了默认模式无法选择其他时间的bug&#xff0c;还增加了2.5小时和3小时两个选项&#xff1b; # 2&#xff09;自定义模式将计时单位从“秒”改为“分钟”&#xff0c;倒计时显示也优化为“小时:分钟:秒”…

未来能源转型之路:2023年第十三届中国国际储能大会启示录

在2023年第十三届中国国际储能大会上&#xff0c;全球各地的能源专家、学者和企业代表齐聚一堂&#xff0c;共同探讨了储能技术在推动能源转型中的重要作用。对于我们普通人来说&#xff0c;从这场大会中可以学到什么呢&#xff1f; 一、储能技术是未来能源发展的关键 随着可再…

Red Hat Enterprise Linux 7.9 安装图解

引导和开始安装 选择倒计时结束前&#xff0c;通过键盘上下键选择下图框选项&#xff0c;启动图形化安装过程。需要注意的不同主板默认或者自行配置的固件类型不一致&#xff0c;引导界面有所不同。也就是说使用UEFI和BIOS的安装引导界面是不同的&#xff0c;如图所示。若手动调…

Go后端开发 -- 反射reflect 结构体标签

Go后端开发 – 反射reflect && 结构体标签 文章目录 Go后端开发 -- 反射reflect && 结构体标签一、反射reflect1.编程语言中反射的概念2.interface 和反射3.变量内置的pair结构4.reflect的基本功能TypeOf和ValueOf5.从relfect.Value中获取接口interface的信息6…

微服务研发时,多个人共同调试一个服务,在nacos会启动多个实例,导致请求服务接口时在你和别人之间来回轮询问题处理

1、问题描述 当我们有两个研发同时在调试一个微服务模块时&#xff0c;你和对方本地都会启动服务&#xff0c;这就导致在nacos会同时注册两个实例。默认情况下请求这个服务&#xff0c;具体处理请求的程序会在你和对方之间来回轮询&#xff0c;即一下你的服务一下对方的服务。…

erlang (OS 操作模块)学习笔记

cmd: env: 返回所有环境变量的列表。 每个环境变量都表示为元组 {VarName&#xff0c;Value}&#xff0c;其中 VarName 是 变量和 Value 其值。 例: {VarName&#xff0c;Value} {"ERLANG_HOME","C:\\Program Files\\erl-24.3.4.2\\bin\\erl-24.3.4.2"}…

将 SQL Server 2022 数据库备份到 MinIO

Microsoft 在将 S3 连接器和 Polybase 添加到 SQL Server 2022 时取得了重大飞跃。因此&#xff0c;企业可以利用他们保存到对象存储中的大量数据&#xff0c;并使用它来丰富 SQL Server 表。他们还可以利用对象存储来备份 SQL Server&#xff0c;这是开放性和云原生灵活性的又…

uniapp打ipa包在ios上运行上传图片提示 打包时未添加Gallery模块

你们好&#xff0c;我是金金金。 场景 uniapp编写好的app云打包后在ios手机上安装成功&#xff0c;app内有一个上传图片的功能&#xff0c;点击上传图片时出现如上图问题 排查 百度了一下问题&#xff0c;也看了下uniapp的官方文档 uniapp官网文档&#xff1a;避免App隐私合规…

实验三 Oracle数据库的创建和管理

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

Day31 46全排列 47全排列II 回溯去重tips 51N皇后 37解数独

46 全排列 给定一个 没有重复 数字的序列&#xff0c;返回其所有可能的全排列。 示例: 输入: [1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 排列问题与组合问题的不同之处就在于&#xff0c;没有startIndex&#xff0c;同时需要设置一个used数组…