P3952 [NOIP2017 提高组] 时间复杂度
时间:2021-08-25
本文章向大家介绍P3952 [NOIP2017 提高组] 时间复杂度,主要包括P3952 [NOIP2017 提高组] 时间复杂度使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
这题开始想用循环做,WA了三发,想得太简单了,没有想到有这种情况的嵌套:
F ...
F ...
E
F ...
E
E
所以改用递归,dfs()返回下一层的时间复杂度(下一层所有并列的F中复杂度的最大情况)
注意:有一个特殊情况就是在出现F i x y
当x比y要大的时候,这个循环(不管他里面有没有嵌套)的复杂度一定是1,所以计算完某一个F循环的所有子循环的复杂度以后,需要特判一下是不是要加到F的复杂度上去
#include<iostream>
#include<vector>
#include<string>
#include<map>
using namespace std;
int idx = 0;
vector<string> v;
map<string, int> table;
#define ERR -2
void get(string &val, string &l, string &r, string &x, int idx){
while(idx < x.size() && x[idx] == ' ') idx ++;
while(idx < x.size() && x[idx] != ' ') val += x[idx ++];
while(idx < x.size() && x[idx] == ' ') idx ++;
while(idx < x.size() && x[idx] != ' ') l += x[idx ++];
while(idx < x.size() && x[idx] == ' ') idx ++;
while(idx < x.size() && x[idx] != ' ') r += x[idx ++];
}
int dfs(int u){
vector<int> comp; // 存一个本层所有for的复杂度序列
string cur_val;
int E = 0;
int F = 0;
while(idx < v.size()){
string t = v[idx];
if(t[0] == 'F'){
if(!E && F){
int ans = dfs(u + 1);
if(ans == ERR) return ans;
if(~comp.back()) comp.back() += max(ans, 0);
continue;
}
E = 0;
F = 1;
string val, l, r;
get(val, l, r, t, 1);
if(table[val]) return ERR;
table[val] = 1;
cur_val = val;
if(l == r) comp.push_back(0);
else if(l == "n") comp.push_back(-1);
else if(r == "n") comp.push_back(1);
else if(stoi(l) <= stoi(r)) comp.push_back(0);
else comp.push_back(-1);
}else{
if(!F){
if(u) break;
else return ERR;
}
E = 1;
F = 0;
table[cur_val] = 0;
}
idx ++;
}
if(!E) return ERR;
int maxv = 0;
for(int i = 0; i < comp.size(); i ++) maxv = max(maxv, comp[i]);
return maxv;
}
int main(){
int t;
cin >> t;
while(t --){
int n;
string o;
cin >> n >> o;
getchar();
v.clear();
for(int i = 0; i < n; i ++){
string t;
getline(cin, t);
v.push_back(t);
}
idx = 0;
table.clear();
int res = dfs(0);
if(res == ERR){
puts("ERR");
continue;
}
int num = 0;
if(o[2] == 'n')
for(int i = 4; i < o.size() && o[i] != ')'; i ++)
num = num * 10 + o[i] - '0';
if(num == res) puts("Yes");
else puts("No");
}
return 0;
}
原文地址:https://www.cnblogs.com/tomori/p/15186491.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法