洛谷【P3952】NOIP2017提高组Day1T2时间复杂度
我对模拟的理解:http://www.cnblogs.com/AKMer/p/9064018.html
题目传送门:https://www.luogu.org/problemnew/show/P3952
作为一个在现场没有切出这题后来才\(A\)掉的弱鸡,我深感惭愧。
主要是因为在\(Day1T1\)上浪费了太多时间,导致根本没有时间写这道模拟题————出考场后我是这样想的,我还以为要是有时间我就可以\(440\)了————所以\(Day1T2\)我爆零了。
什么?你说这种水题我怎么还爆零?前\(30\)分不是送给我的吗?
说起我爆零的原因都有些感到颜面扫地……作为八中的学生我居然没分清楚大小写。一看题目,瞬间被\(ERR\)吸引住了眼球,然后把\(Yes\)当作了\(YES\),把\(No\)当作了\(NO\)……
但是今天我也花了1个多小时,在有数据的情况下才A掉,说明我的思维还是窄了点,想的不够全面。\(440\)不存在的,当初就算没看错大小写也就只有\(370\)……
我们只需要用栈维护循环语句开头与结尾的匹配,并且维护“每个循环内的最高时间复杂度”就可以了。假设在最外面再套一个不存在的循环,那么该循环内的最高时间复杂度就是题目要求的答案。
要注意一个循环内如果有多个互不干扰的循环,要用所有互不干扰的循环的复杂度取max更新当前循环的复杂度
时间复杂度:\(O(n)\);
空间复杂度:\(O(n)\);
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int inf=2e9;//把变量n当作inf
int n,T;
bool bo[30];//用来判断变量重名
char tim[20];
struct stence {
int Max;//在此层循环内的时间复杂度最多是n^Max
char opt[10],var[10],x[10],y[10];
}sta[200],s[200];//我用栈模拟,所有语句提前全部读完,不然我用solve会GG
int trans(char *a) {//将字符串转成数字
if(a[1]=='n')return inf;
int num=0,len=strlen(a+1);
for(int i=1;i<=len;i++)
num=num*10+a[i]-'0';
return num;
}
bool solve() {
int top=0,Maxtim=0;
for(int i=1;i<=n;i++) {
if(s[i].opt[1]=='F') {
if(bo[s[i].var[1]-'a'])return 0;
bo[s[i].var[1]-'a']=1;
sta[++top]=s[i];
}
else {
if(!top)return 0;
int a=trans(sta[top].x),b=trans(sta[top].y);
bo[sta[top].var[1]-'a']=0;
if(a>b)sta[top].Max=0;//不会进入当前循环
if(a!=inf&&b==inf)sta[top-1].Max=max(sta[top-1].Max,sta[top].Max+1);
else if(a<=b)sta[top-1].Max=max(sta[top-1].Max,sta[top].Max);//一定要记得写成a<=b而不是a<b,相等也是会进入循环的
if(top==1)Maxtim=max(Maxtim,sta[0].Max);
top--;
}
}
if(top)return 0;
if(Maxtim==0&&tim[3]=='1')puts("Yes");
else {
int num=0,len=strlen(tim+1);
for(int i=5;i<len;i++)
num=num*10+tim[i]-'0';
if(num==Maxtim)puts("Yes");
else puts("No");
}//判断正确与否
return 1;
}
int main() {
scanf("%d",&T);
while(T--) {
scanf("%d%s",&n,tim+1);
memset(bo,0,sizeof(bo));//clear
sta[0].Max=0;//sta[0]是假设的不存在的最外层的循环,根据定义,sta[0].Max就是答案
for(int i=1;i<=n;i++) {
scanf("%s",s[i].opt+1);
if(s[i].opt[1]=='F')
scanf("%s%s%s",s[i].var+1,s[i].x+1,s[i].y+1);
}
if(!solve())puts("ERR");
}
return 0;
}
洛谷【P3952】NOIP2017提高组Day1T2时间复杂度的更多相关文章
- 洛谷P1311 [NOIP2011提高组Day1T2]选择客栈
P1311 选择客栈 题目描述 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一 ...
- 洛谷 3953 NOIP2017提高组Day1 T3 逛公园
[题解] 先建反向图,用dijkstra跑出每个点到n的最短距离dis[i] 设f[u][k]表示dis(u,n)<=mindis(u,n)+k的方案数.对于边e(u,v,w),走了这条边的话需 ...
- 洛谷P1967 [NOIP2013提高组Day1T2]货车运输
P1967 货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过 ...
- 洛谷P1966 [NOIP2013提高组Day1T2]火柴排队
P1966 火柴排队 题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi) ...
- NOIP 2017 提高组 day1t2 时间复杂度
P3952 时间复杂度 标签 NOIp提高组 2017 时空限制 1000ms / 128MB 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂 ...
- 洛谷 P2678 & [NOIP2015提高组] 跳石头
题目链接 https://www.luogu.org/problemnew/show/P2678 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布 ...
- 洛谷 P1025 & [NOIP2001提高组] 数的划分(搜索剪枝)
题目链接 https://www.luogu.org/problemnew/show/P1025 解题思路 一道简单的dfs题,但是需要剪枝,否则会TLE. 我们用dfs(a,u,num)来表示上一个 ...
- 洛谷P1514 [NOIP2010提高组T4]引水入城
P1514 引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城 ...
- 洛谷P1084 [NOIP2012提高组Day2T3]疫情控制
P1084 疫情控制 题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控 ...
随机推荐
- Gone Fishing(贪心)
Gone Fishing John is going on a fising trip. He has h hours available (1 ≤ h ≤ 16), and there are n ...
- PhotoKit详解
Photokit介绍 这篇主要介绍如何通过 Photokit获取数据 photokit.jpg 1,基类 PHObject Photos 框架中的根类PHObject只有一个公开接口 localIde ...
- 使用 Python 为 KVM 编写脚本,第 1 部分: libvirt
虚拟化是目前市场上大多数服务器操作系统的标准设备.在 Linux® 的世界里,服务器虚拟化有两个主要选择:基于 Kernel 的虚拟机 (KVM) 和 Xen.KVM 是 Red Hat 和其他公司采 ...
- Arduino 看门狗使用
1.需要调用 #include <avr/wdt.h> 2.设置看门狗复位时间 wdt_enable(WDTO_2S); 代码时间定义的底层查看 #define WDTO_15MS 0 / ...
- gulp 打包报错:ReferenceError: internalBinding is not defined
> gulp build internal/util/inspect.js:31 const types = internalBinding('types'); ^ ReferenceError ...
- js实现select动态添加option
关于 select 的添加 option 应该注意的问题. 标准的做法如上也就是说,标准的做法是 s.options.add();但是如果你一定要用 s.appendChild(option);注意了 ...
- Java多线程系列 JUC线程池06 线程池原理解析(五)
ScheduledThreadPoolExecutor解析 ScheduledThreadPoolExecutor适用于延时执行,或者周期性执行的任务调度,ScheduledThreadPoolExe ...
- 《程序员代码面试指南》第五章 字符串问题 去掉字符串中连续出现k 个0 的子串
题目 去掉字符串中连续出现k 个0 的子串 java代码 package com.lizhouwei.chapter5; /** * @Description: 去掉字符串中连续出现k 个0 的子串 ...
- Python导出数据生成excel报表
#_*_coding:utf-8_*_ import MySQLdb import xlwt from datetime import datetime def get_data(sql): # 创建 ...
- 20145229吴姗珊 《Java程序设计》第3周学习总结
20145229吴姗珊 <Java程序设计>第3周学习总结 教材学习内容总结 第四章 认识对象 4.1类与对象 1.对象(Object):存在的具体实体,具有明确的状态和行为 2.类(Cl ...