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个分区可以全部为主分区&…

【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之于虚拟机就…

从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…

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

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

第二百七十二回

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

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…

MCU和MPU有什么区别

大家好&#xff0c;今天给大家介绍MCU和MPU有什么区别&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 MCU&#xff08;Microcontroller Unit&#xff09;和MPU&#xff08;Micro…

蓝桥杯备赛 day 2 —— 二分算法(C/C++,零基础,配图)

目录 &#x1f308;前言&#xff1a; &#x1f4c1; 二分的概念 &#x1f4c1; 整数二分 &#x1f4c1; 二分的模板 &#x1f4c1; 习题 &#x1f4c1; 总结 &#x1f308;前言&#xff1a; 这篇文章主要是准备蓝桥杯竞赛同学所写&#xff0c;为你更好准备蓝桥杯比赛涉及…

从0到1:实验室设备借用小程序开发笔记

概论 实验室设备借用小程序&#xff0c;适合各大高校&#xff0c;科技园区&#xff0c;大型企业集团的实验室设备借用流程, 通过数字化的手段进一步提升相关单位设备保障水平&#xff0c;规范实验室和设备管理&#xff0c;用户通过手机小程序扫描设备的二维码&#xff0c;可以…

深入解析:如何使用Java、SpringBoot、Vue.js和MySQL构建课表管理系统

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

VS代码生成工具ReSharper v2023.3正式发布——支持C# 12

实质上&#xff0c;ReSharper特征可用于C#&#xff0c;VB.net&#xff0c;XML&#xff0c;Asp.net&#xff0c;XAML&#xff0c;和构建脚本。 使用ReSharper&#xff0c;你可以进行深度代码分析&#xff0c;智能代码协助&#xff0c;实时错误代码高亮显示&#xff0c;解决方案范…

JavaScript基础(27)_内联样式的获取和修改、获取元素当前显示的样式

内联样式的获取和修改 获取元素的内联样式&#xff1a; 语法&#xff1a;元素.style.样式名 注意&#xff1a;通过style属性设置和读取的都是内联样式&#xff0c;无法读取样式表中的样式。 修改元素的内联样式&#xff1a; 语法&#xff1a;元素.style.样式名 样式值比如…