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.mzph.cn/news/630397.shtml

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

相关文章

openssl3.2 - 官方demo学习 - guide - tls-client-block.c

文章目录 openssl3.2 - 官方demo学习 - guide - tls-client-block.c概述记录问题server和client IP都为localhostserver和client IP都为127.0.0.1想到解决问题的方法1想到解决问题的方法2笔记END openssl3.2 - 官方demo学习 - guide - tls-client-block.c 概述 tls 客户端 官…

QT5构建套件检测不到MSVC2017解决方法

文章目录 前言一、本地环境二、现象三、解决办法 前言 记录一下 QT5 构建套件检测不到 MSVC2017 解决方法 。Qt Creator MSVC开发环境搭建&#xff08;Qt Creator 集成工具 MSVC编译&#xff09; 一、本地环境 电脑操作系统&#xff1a;Win11Qt 版本&#xff1a;Qt 5.14.2 …

linux基础学习(2):磁盘管理、分区、格式化

1.一些基本概念 一块磁盘从加入到可使用&#xff0c;需要经过3个阶段&#xff1a;分区-格式化-挂载。 1.1分区方式 linux有2种分区方式&#xff1a; &#xff08;1&#xff09;mbr&#xff1a;最大支持2.1T硬盘&#xff0c;最多支持4个分区。这4个分区可以全部为主分区&…

77、avx2 向量寄存器介绍

本节带大家简单了解下计算机内的存储器,了解了存储器之后,对于后面的优化就会有更深刻的认识。 我们最熟悉的存储器就是电脑的内存,或者硬盘。在计算机系统中,我们可以把所有可以存储数据的部件都叫做存储器。 只不过很多是用户可见并熟悉的,如硬盘和内存条,GPU 的显存…

【elementUI】el-select相关问题

官方使用DEMO <template><el-select v-model"value" placeholder"请选择"><el-optionv-for"item in options":key"item.value":label"item.label":value"item.value"></el-option></…

鸿蒙开发笔记(三):页面和自定义组件生命周期

先明确自定义组件和页面的关系&#xff1a; 自定义组件&#xff1a;Component装饰的UI单元&#xff0c;可以组合多个系统组件实现UI的复用。 页面&#xff1a;即应用的UI页面。可以由一个或者多个自定义组件组成&#xff0c;Entry装饰的自定义组件为页面的入口组件&#xff0c…

QEMU与KVM基本概述

一些术语 汇总在虚拟化世界里经常会涉及到的术语或缩写等。 术语含义VMVirtual Machine&#xff0c;虚拟机VMM在系统虚拟化中&#xff0c;管理全局物理资源的软件叫作虚拟机监控器&#xff08;Virtual MachineMonitor&#xff0c;VMM&#xff09;&#xff0c;VMM之于虚拟机就…

一篇文章掌握WebService服务、工作原理、核心组件、主流框架

目录 1、WebService定义 解决问题&#xff1a; 2、WebService的工作原理 2.1 实现一个完整的Web服务包括以下步骤 2.2 调用方式 3、Web Service的核心组件 3.1 XML 3.2 SOAP 3.3 WSDL 3.4 UDDI 4、主流框架 4.1 AXIS(已淘汰) 4.2 XFire 4.3 CXF 5、Soap协议详解…

从DETR到Mask2former(2): 损失函数loss function

DETR的损失函数包括几个部分&#xff0c;如果只看论文或者代码&#xff0c;比较难理解&#xff0c;最好是可以打断点调试&#xff0c;对照着论文看。但是现在DETR模型都已经被集成进各种框架中&#xff0c;很难进入内部打断掉调试。与此同时&#xff0c;数据的label的前处理也比…

《动手学深度学习》学习笔记 第8章 循环神经网络

本系列为《动手学深度学习》学习笔记 书籍链接&#xff1a;动手学深度学习 笔记是从第四章开始&#xff0c;前面三章为基础知识&#xff0c;有需要的可以自己去看看 关于本系列笔记&#xff1a; 书里为了让读者更好的理解&#xff0c;有大篇幅的描述性的文字&#xff0c;内容很…

Vue3中动态组件使用

一&#xff0c;动态组件使用&#xff1a; 应用场景&#xff1a;动态绑定或切换组件 应用Vue3碎片&#xff1a; is 1.使用 a.组件A <div class"layout-base"><Button>红茶</Button> </div>a.组件B <div class"layout-base"&g…

python基础教程九 抽象一(函数初步)

1. 懒惰是种美德 前面编写的程序都很小&#xff0c;但如果要编写大型程序&#xff0c;你很快会遇到麻烦。想想看&#xff0c;如果你在一个地方编写了一些代码&#xff0c;但需要在另一个地方再次使用&#xff0c;该如何办?例如&#xff0c;假设你编写了一段代码&#xff0c;他…

Linux 常用的一些命令

目录 一、常用文件管理命令二、tmux 和 vimtmuxvim 三、[Shell语法](https://blog.csdn.net/weixin_43288201/article/details/105643692)四、git五、sshReference 一、常用文件管理命令 (1) ctrl c: 取消命令&#xff0c;并且换行 (2) ctrl u: 清空本行命令 (3) tab键&#x…

【MATLAB】SVMD_LSTM神经网络时序预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 SVMD-LSTM神经网络时序预测算法是一种结合了单变量经验模态分解&#xff08;Singular Value Decomposition&#xff0c;SVD&#xff09;和长短期记忆神经网络&#xff08;LSTM&#xff09…

前端基础:回顾es6相关知识

Author note(题记)&#xff1a; ECMAscript is international standard of javascript。 ECMA 是 js的国际标准版语言。 let and const 为什么之前用var现在需要用let&#xff0c;const呢&#xff1f; 其实就是因为规范作用域的问题。var的作用域无块级 for (var i 0; i <…

第二百七十二回

文章目录 1. 概念介绍2. 方法与类型2.1 使用方法2.2 常见类型 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何加载本地图片"相关的内容&#xff0c;本章回中将介绍如何获取文件类型.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回…

常用的消息队列和中间件都有哪些

常用的消息队列和中间件有以下几种&#xff1a; RabbitMQ&#xff1a;RabbitMQ是一个开源的消息队列中间件&#xff0c;使用Erlang语言编写。它具有可靠性、灵活性和易用性的特点&#xff0c;支持多种消息协议。 Kafka&#xff1a;Kafka是一个高吞吐量的分布式发布订阅消息系统…

23.实战演练--个人主页

<?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"><applicationandroid:allowBackup"true"an…

【项目实战】Postgresql数据库中出现锁表如何解决

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 系列专栏目录 [Java项目…

Unity之触发器

目录 &#x1f4d5;一、触发器概念 &#x1f4d5;二、碰撞与触发的区别 &#x1f4d5;三、触发器小实例 一、触发器概念 第一次玩侠盗猎车手是在小学&#xff0c;从那以后就开启了我的五星好市民之路。 下面是小编在小破站截的图&#xff0c;这是罪恶都市最开始的地方&a…