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];
		// 如果程序不是E
		if (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;
}

运行结果

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ilqr 算法说明

1 Introduction 希望能用比较简单的方式将ilqr算法进行整理和总结。 2 HJB方程 假定我们现在需要完成一个从A点到B点的任务&#xff0c;执行这段任务的时候&#xff0c;每一步都需要消耗能量&#xff0c;可以用下面这个图表示。 我们在执行这个A点到B点的任务的时候&#xf…

项目架构之Zabbix部署

1 项目架构 1.1 项目架构的组成 业务架构&#xff1a;客户端 → 防火墙 → 负载均衡&#xff08;四层、七层&#xff09; → web缓存/应用 → 业务逻辑&#xff08;动态应用&#xff09; → 数据缓存 → 数据持久层 运维架构&#xff1a;运维客户端 → 跳板机/堡垒机&#x…

2023年第十四届蓝桥杯软件赛省赛总评

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周。 在QQ群上交流答疑&am…

VUE工程化--vue组件注册

组件注册的两种方式&#xff1a; 1. 局部注册&#xff1a;只能在注册的组件内使用 2. 全局注册&#xff1a;所有组件内都能使用 局部注册步骤&#xff1a; 1、导入 import MyHeader from "./components/myHeader.vue"; import MyMain from "./components/myMa…

TCP连接TIME_WAIT

TCP断开过程: TIME_WAIT的作用: TIME_WAIT状态存在的理由&#xff1a; 1&#xff09;可靠地实现TCP全双工连接的终止 在进行关闭连接四次挥手协议时&#xff0c;最后的ACK是由主动关闭端发出的&#xff0c;如果这个最终的ACK丢失&#xff0c;服务器将重发最终的FIN&#xf…

LLM漫谈(三)| 使用Chainlit和LangChain构建文档问答的LLM应用程序

一、Chainlit介绍 Chainlit是一个开源Python包&#xff0c;旨在彻底改变构建和共享语言模型&#xff08;LM&#xff09;应用程序的方式。Chainlit可以创建用户界面&#xff08;UI&#xff09;&#xff0c;类似于由OpenAI开发的ChatGPT用户界面&#xff0c;Chainlit可以开发类似…

虚拟机CentOS7.5编译安装Qt4.8.7

虚拟机CentOS7.5编译安装Qt4.8.7 一.下载Qt二.安装步骤 一.下载Qt 官网下载链接&#xff1a;Qt4.8.7 官网下载速度可能会非常慢&#xff0c;本人已上传至CSDN&#xff0c;点此下载&#xff0c;下载后需要先用7z软件解压成zip包。 二.安装步骤 环境安装 yum install libX11…

go语言(三)----函数

1、函数单变量返回 package mainimport "fmt"func fool(a string,b int) int {fmt.Println("a ",a)fmt.Println("b ",b)c : 100return c}func main() {c : fool("abc",555)fmt.Println("c ",c)}2、函数多变量返回 pack…

Nsis打包Unity Exe文件(通用)

Nsi 脚本 !include "MUI2.nsh"#使用现代UI Unicode true #使用Unicode !define EXENAME "exeName" #定义常量 exe名称 !define SHORTCUT "快捷方式名称" #定义桌面快捷方式的中文名称Name ${EXENAME} #安装程序的title OutFile "${EXENAME…

【C++】入门C++前想要了解的小知识

个人主页 &#xff1a; zxctsclrjjjcph 文章封面来自&#xff1a;艺术家–贤海林 如有转载请先通知 目录 1. 前言2. 什么是C3. C的发展史4. C的重要性4.1 语言的使用广泛度4.2 在工作领域中4.3 在校招领域中 5. 如何学习C5.1 看看别人怎么学习的5.2 自己怎么学 1. 前言 今天开…

FFmpeg之SwrRessample

文章目录 一、概述二、重采样流程三、重要结构体3.1、SwrContext3.2、ResamplerContext 四、重要函数4.1、swr_alloc4.2、swr_alloc_set_opts4.3、av_opt_set_*4.4、swr_init4.5、av_samples_alloc_array_and_samples4.6、av_samples_alloc4.7、swr_convert4.8、swr_get_delay4…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -投票帖子排行实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

【idea】idea插件编写教程,博主原创idea插件已上架idea插件市场 欢迎下载

前言&#xff1a;经常使用Objects.equals(a,b)方法的同学 应该或多或少都会因为粗心而传错参&#xff0c; 例如日常开发中 我们使用Objects.equals去比较 status(入参)&#xff0c;statusEnum(枚举), 很容易忘记statusEnum.getCode() 或 statusEnum.getVaule() &#xff0c;再比…

Java可视化物联网智慧工地综合云平台源码 私有化部署

智慧工地平台围绕建筑施工人、物、事的安全管理为核心&#xff0c;对应研发了劳务实名制、视频监控、扬尘监测、起重机械安全监测、安全帽监测等功能一体化管理的解决方案。 智慧工地是聚焦工程施工现场&#xff0c;紧紧围绕人、机、料、法、环等关键要素&#xff0c;综合运用…

docker安装运行CloudBeaver并设置默认语言为中文

1、CloudBeaver CloudBeaver 是一个开源的 Web 数据库管理工具&#xff0c;它提供了一个基于浏览器的用户界面&#xff0c;允许用户管理和操作各种类型的数据库。CloudBeaver 支持多种数据库系统&#xff0c;包括但不限于 PostgreSQL、MySQL、SQLite、Oracle、SQL Server 以及…

RabbitMQ入门精讲

1. 什么是消息队列 消息指的是两个应用间传递的数据。数据的类型有很多种形式&#xff0c;可能只包含文本字符串&#xff0c;也可能包含嵌入对象。 “消息队列(Message Queue)”是在消息的传输过程中保存消息的容器。在消息队列中&#xff0c;通常有生产者和消费者两个角色。…

【Java基础_01】Java运行机制及运行过程

【Java基础_01】Java运行机制及运行过程 文章目录 【Java基础_01】Java运行机制及运行过程1.Java 运行机制及运行过程1.1 Java 核心机制-Java 虚拟机 [JVM java virtual machine] 1.2 JDK&#xff0c;JRE1.3 JVM,JDK和JRE1.4 环境变量path1.4.1 为什么要配置path1.4.2 配置环…

【一步一步学】ROS软路由设置代理IP教程

申明&#xff1a;本文仅针对国内L2TP/PPTP&#xff0c;适用于国内的游戏加速或学术研究&#xff0c;禁止一切利用该技术的翻墙行为。 今天和大家分享的是ROS软路由如何设置分流的问题&#xff0c;很多做过工作室的小伙伴肯定很熟悉。 简单来讲&#xff0c;ROS软路由就是普通的路…

数模转换 120dB,192kHz DAC 音频转换芯片DP7398 软硬件兼容替代CS4398

数模转换芯片&#xff08;DAC&#xff09;是一种将数字信号转换为模拟信号的集成电路。它通过将数字数据转换为相应的模拟电压或电流输出&#xff0c;实现了数字系统与模拟系统之间的接口和互联。 DAC具有许多优势&#xff0c;使其在各种应用领域得到广泛应用。首先&#xff0c…

接口测试 01 -- 基础与原理

接口概述 什么是接口 接口是计算机系统中不同组件之间进行交流和互动的一种方式。 在软件开发中&#xff0c;接口通常指的是一组定义了输入、输出、功能和规范的方法、函数或协议。接口定义了组件之间的通信协议&#xff0c;使得它们可以相互协作&#xff0c;实现特定的功能。…