NOIP2017 时间复杂度 大模拟

再写一道大模拟题。
由于是限时写的,相当于考场代码,乱的一批。
题目链接:P3952 时间复杂度
先记几个教训:
- 字符串形式的数字比较大小老老实实写函数,字典序都搞错几次了
- 栈空的时候不但pop()会RE,top()访问栈顶也会RE
- 数字以字符形式读入要考虑位数超过一位
思路:
1.我用的是在线做法。
2.使用结构体存储一个循环体,包括变量名、起始与结束、是否与n有关、是否能够进入(这一点麻烦了,在栈里推入是否与n有关以及是否能够进入就行了)
3.使用一个变量存储当前进入的层数(只记含n的),当压入一个“与n有关”时++,当弹出一个“与n有关”时--,取最大值
4.使用一个bool存储当前循环是否能进入。当弹出一个不能进入的结构体时取消“不能进入”的状态(如果已在“不能进入”的状态,结构体不会被记作“不能进入”)
源码:
//MiserWeyte is now "mzWyt"
#include <bits/stdc++.h>
using namespace std;
int n, tgt, rel, curr = 0, maxx;
bool used[30];
string tar;
bool err, notin;
struct sts{
	char tpe, nam;
	string sta, end;
	bool use, nin;
};
bool le(string a, string b){
	if(a=="n" || b=="n" ) return false;
	int numa = atoi(a.c_str());
	int numb = atoi(b.c_str());
	return numa > numb;
}
stack <sts> s;
void init(){
	err = false;
	memset(used, 0, sizeof(used));
	curr = 0;
	maxx = 0;
	notin = false;
	while(s.size()) s.pop();
}
int main(){
	int t;
	cin >> t;
	while(t--){
		init();
		cin >> n >> tar;
		tgt = 0;
		if(tar[2] != '1'){
			for(int i=0; i<tar.length(); i++){
				if(tar[i] >= '0' && tar[i] <= '9'){
					tgt *= 10;
					tgt += tar[i] - '0';
				}
			}
		}
		for(int i=0; i<n; i++){
			sts temp;
			cin >> temp.tpe;
			if(temp.tpe == 'F'){
				cin >> temp.nam ;
				cin>> temp.sta;
				cin>> temp.end;
				temp.use = false;
				temp.nin = false;
				if(used[temp.nam - 'a']){
					err = true;
//					break;
				}
				used[temp.nam - 'a'] = true;
				if(notin){
					s.push(temp);
				}
				else if(temp.sta == "n" && temp.end == "n") s.push(temp);
				else if(temp.sta != "n" && temp.end == "n"){
					temp.use = true;
					curr ++;
					maxx = max(maxx, curr);
					s.push(temp);
				}
				else if((temp.sta == "n" && temp.end != "n") || le(temp.sta, temp.end)){
					notin = true;
					temp.nin = true;
					s.push(temp);
				}
				else s.push(temp);
			}
			else{
				if(s.empty()){
					err = true;
					continue;
				}
				if(s.size() && s.top().use && !s.top().nin) curr --;
//				cout << s.top().use;
				if(s.size() && s.top().nin) notin = false;
				used[s.top().nam - 'a'] = false;
				if(s.size()) s.pop();
			}
//			cout << "curr" << curr << endl;
//			if(notin) cout << "NOTIN" << endl;
		}
		if(s.size()) err = true;
		if(err) cout << "ERR\n";
		else{
			if(maxx == tgt) cout << "Yes\n";
			else cout << "No\n";
//			cout << curr << endl;
		}
	}
}
NOIP2017 时间复杂度 大模拟的更多相关文章
- 【 P3952】 时间复杂度 大模拟题解
		题目链接 完全模拟 1.模拟结果 当我们的模拟程序执行结束时,直接执行模拟结果函数,用于比对我们的结果和数据给出的结果. bool yes(char a[],char b[]) { ;i<=;+ ... 
- NOIp2017真题模拟赛 By cellur925
		果然我还是最菜的==不接受反驳 (先考了day2喵喵喵) Day2 T1:奶酪 期望得分:100分 实际得分:100分 考察:并查集 思路:这题其实之前做过了==.思路还是比较清晰的,读入时预处理出可 ... 
- NOIP2017提高组 模拟赛15(总结)
		NOIP2017提高组 模拟赛15(总结) 第一题 讨厌整除的小明 [题目描述] 小明作为一个数学迷,总会出于数字的一些性质喜欢上某个数字,然而当他喜欢数字k的时候,却十分讨厌那些能够整除k而比k小的 ... 
- NOIP2017提高组模拟赛 9 (总结)
		NOIP2017提高组模拟赛 9 (总结) 第一题 星星 天空中有N(1≤N≤400)颗星,每颗星有一个唯一的坐标(x,y),(1≤x,y ≤N).请计算可以覆盖至少K(1≤K≤N)颗星的矩形的最小面 ... 
- 【比赛】NOIP2017 时间复杂度
		恶心的模拟题,考场上犯了一堆错误,多组数据清空没清完.数组开小...民间都是50分,结果CCF90.. 考完后随便改改就过了,还好只少了10分,如果真的是50,我估计会疯掉. 因为考场的时候没写好,所 ... 
- [Luogu 3952] NOIP2017 时间复杂度
		[Luogu 3952] NOIP2017 时间复杂度 一年的时间说长不长,说短,也不短. 一年之内无数次觉得难得可怕的题目,原来也就模拟这么回事儿. #include <cstdio> ... 
- NOIP2017提高组模拟赛 10 (总结)
		NOIP2017提高组模拟赛 10 (总结) 第一题 机密信息 FJ有个很奇怪的习惯,他把他所有的机密信息都存放在一个叫机密盘的磁盘分区里,然而这个机密盘中却没有一个文件,那他是怎么存放信息呢?聪明的 ... 
- NOIP2017提高组模拟赛 8(总结)
		NOIP2017提高组模拟赛 8(总结) 第一题 路径 在二维坐标平面里有N个整数点,Bessie要访问这N个点.刚开始Bessie在点(0,0)处. 每一步,Bessie可以走到上.下.左.右四个点 ... 
- NOIP2017提高组模拟赛4 (总结)
		NOIP2017提高组模拟赛4 (总结) 第一题 约数 设K是一个正整数,设X是K的约数,且X不等于1也不等于K. 加了X后,K的值就变大了,你可以重复上面的步骤.例如K= 4,我们可以用上面的规则产 ... 
随机推荐
- unittest详解(二) 跳过用例的执行(skip)
			在执行测试用例时,有时候有些用例是不需要执行的,那我们怎么办呢?难道删除这些用例?那下次执行时如果又需要执行这些用例时,又把它补回来?这样操作就太麻烦了. unittest提供了一些跳过指定用例的方法 ... 
- python27 错误汇总
			一.TypeError: object of type 'NoneType' has no len() 解决的方法: 源代码:resp_data = None (None是一个空的对象) 修改后代码 ... 
- 翻译 | 上手 Webpack ? 这篇就够了!
			译者:小 boy (沪江前端开发工程师) 本文原创,转载请注明作者及出处. 原文地址:https://www.smashingmagazine.com/2017/02/a-detailed-intro ... 
- 消息队列rabbitmq/kafka
			12.1 rabbitMQ 1. 你了解的消息队列 rabbitmq是一个消息代理,它接收和转发消息,可以理解为是生活的邮局.你可以将邮件放在邮箱里,你可以确定有邮递员会发送邮件给收件人.概括:rab ... 
- 菜鸟requireJS教程---1、初识requirejs
			菜鸟requireJS教程---1.初识requirejs 一.总结 一句话总结: Using a modular script loader like RequireJS will improve ... 
- 1.5 log4j使用教程
			日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供方便的日志记录.在apache网站:jakarta.apache.org/log4j 可以免费下载到Log ... 
- leetcode 17电话号码的字母组合
			与子集70?类似,子集每次两个分支,本题每次k个分支,子集是第一次不push第二次push元素,本题是每次都push元素,因此,本题答案的长度都为k,子集题目为各种组合: /** res,level, ... 
- android 给控件使用自定义字体Typeface
			第一步:将字体资源放在assets 资源文件夹下: 第二步:获取字体资源 Typeface mTf = Typeface.createFromAsset(c.getAssets(), "Op ... 
- 再谈 Devstack(Rocky)
			目录 文章目录 目录 前言 网络拓扑 运行环境 要点 步骤 前言 之前写过一篇<Openstack 实现技术分解 (1) 开发环境 - Devstack 部署案例详解>,随着 Devsta ... 
- 工具栏对象GUI Status 与GUI Title
			GUI Status 与GUI Title用于自定义工具栏按钮及Report程序标题栏显示内容, 可以通过se41\SE80或直接SE38中展开对象列表进行相关操作. 如下是在SE38里,点击[显示物 ... 
