luogu 3952 时间复杂度

noip2017 D1T2 某zz选手考场上写了1.5h 考完之后发现自己写的是错的 但是结果A了???

题目大意:

一种新的编程语言 A++ 给出一个程序只有循环语句 并给出这个程序的时间复杂度

判断每个程序给出的时间复杂度是否正确。

A++语言的循环结构如下:

F i x y
    循环体
E

其中F i x y表示新建变量i(变量i不可与未被销毁的变量重名)并初始化为 x 然后判断 i 和 y 的大小关系,若 i 小于等于 y 则进入循环 否则不进入

每次循环结束后 i 都会被修改成 i +1,一旦 i 大于 y 终止循环

x 和 y 可以是正整数(x 和 y 的大小关系不定)或变量 n  n 是一个表示数据规模的变量 在时间复杂度计算中需保留该变量而不能将其视为常数 该数远大于 100

“E”表示循环体结束 循环体结束时,这个循环体新建的变量也被销毁

输入格式:

T组数据

每个程序我们只需抽取其中 F i x yE即可计算时间复杂度,注意:循环结构 允许嵌套。

接下来每个程序的第一行包含一个正整数 L 和一个字符串,L 代表程序行数,字符串表示这个程序的复杂度

O(1)表示常数复杂度,O(n^w)表示复杂度为n^w,其中w是一个小于100的正整数(输入中不包含引号),输入保证复杂度只有O(1)O(n^w) 两种类型

接下来 L 行代表程序中循环结构中的F i x y或者 E

程序行若以F开头,表示进入一个循环,之后有空格分离的三个字符(串)i x y, 其中 i 是一个小写字母(保证不为n),表示新建的变量名

x 和 y 可能是正整数或 n ,已知若为正整数则一定小于 100

程序行若以E开头,则表示循环体结束

输出格式:

输出文件共 t 行,对应输入的 t 个程序,每行输出YesNo或者ERR,若程序实际复杂度与输入给出的复杂度一致则输出Yes,不一致则输出No

若程序有语法错误(其中语法错误只有: ① F 和 E 不匹配 ②新建的变量与已经存在但未被销毁的变量重复两种情况),则输出ERR

注意:即使在程序不会执行的循环体中出现了语法错误也会编译错误,要输出 ERR

思路:

模拟

之前错的是因为没有考虑有两个进不去的循环嵌套(但还是A了

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstdlib>
 5 #include<cmath>
 6 #include<cstring>
 7 #include<vector>
 8 #include<map>
 9 #include<queue>
10 #define ll long long
11 #define inf 2147483611
12 #define MAXN 110
13 #define MOD
14 using namespace std;
15 inline int read()
16 {
17     int x=0,f=1;char ch=getchar();
18     while(!isdigit(ch)) {if(ch==‘-‘) f=-1;ch=getchar();}
19     while(isdigit(ch)) {x=x*10+ch-‘0‘;ch=getchar();}
20     return x*f;
21 }
22 int T,n,t3,t2,ans,tmp,tp,len,st[MAXN],s[MAXN];
23 char o[30],ch[4][4];
24 bool hsh[30],k[MAXN],j[MAXN];
25 int main()
26 {
27
28     //freopen("complexity.in","r",stdin);
29     //freopen("complexity.out","w",stdout);
30     T=read();
31     bool f;int sp;
32     while(T--)
33     {
34         n=read(),tmp=tp=ans=t3=t2=sp=0,f=1;scanf("%s",o);
35         memset(hsh,0,sizeof(hsh));
36         memset(j,0,sizeof(j));
37         for(int i=1;i<=n;i++)
38         {
39             scanf("%s",ch[0]);
40             if(ch[0][0]==‘E‘)
41             {
42                 hsh[st[tp]]=0;
43                 if(k[s[tp]]) tmp--;
44                 if(j[s[tp]]) sp--;
45                 tp--;
46                 if(tp<0) f=0;
47                 continue;
48             }
49             tp++;
50             s[tp]=i;
51             cin>>ch[1]>>ch[2]>>ch[3];
52             len=strlen(ch[2]);
53             if(isdigit(ch[2][0])) t2=ch[2][0]-‘0‘;
54             else t2=inf;
55             if(len==2) t2=t2*10+ch[2][1]-‘0‘;
56             len=strlen(ch[3]);
57             if(isdigit(ch[3][0])) t3=ch[3][0]-‘0‘;
58             else t3=inf;
59             if(len==2) t3=t3*10+ch[3][1]-‘0‘;
60             if(hsh[ch[1][0]-‘a‘]) f=0;
61             hsh[ch[1][0]-‘a‘]=1;st[tp]=ch[1][0]-‘a‘;
62             if(t2>t3) {sp++;j[i]=1;}
63             if(t2<t3&&t3==inf)
64             {
65                 tmp++;
66                 k[i]=1;
67                 if(sp) continue;
68                 ans=max(ans,tmp);
69             }
70             else k[i]=0;
71         }
72         if(tp>0||!f) {puts("ERR");continue;}
73         len=strlen(o);
74         if(len==4&&ans==0) {puts("Yes");continue;}
75         int l=o[len-2]-‘0‘;
76         if(isdigit(o[len-3])) l+=10*(o[len-3]-‘0‘);
77         if(len>4&&l==ans) {puts("Yes");continue;}
78         puts("No");
79     }
80 }

时间: 2024-10-03 22:26:14

luogu 3952 时间复杂度的相关文章

luogu 3952 时间复杂度(模拟)

时间复杂度 这道题从两个月前开始做,一直没做出来,最后今晚决心一定要做出来.于是开始认真的在打草纸上写思路,最后在AC的那一刻,差点哭了出来!! 题目大意 这个自己看吧,noip2017的D1T2 solution 先介绍一下这道题我们用到的每个变量他们的用处 stack[]记录变量的循环层 vis[]记录变量在栈中是否出现过 cmp函数,这个可以用作比较循环中a和b的大小 \[ \begin{cases} a<b -> 进入新的一层循环\a>b -> 无法进入新的循环,循环终止\

【luogu P3952 时间复杂度】题解

对于2017 D1 T2 这道题 实实在在是个码力题,非常考验耐心. 其实大体的思路并不是非常难想出来,但是要注意的小细节比较多. 题目链接:https://www.luogu.org/problemnew/show/P3952 思路 对于每一个程序,先读入L和O(),并将其中的时间复杂度抠出来. 其次整行读入字符串,即所给定的程序. 判断第一个字符是F or E F i x y 需要把x y拿出来,把i压进栈 E 退栈 压进i后为了方便退栈及退栈时判断,用一个flag标记 每做完一个程序,与前

luogu P3952 时间复杂度题解

显然这是一道大模拟 我们要做的就是读入一堆字符串,然后模拟这个循环. 定义某一层的复杂度为执行完这一层循环之后,消耗的复杂度. 某层循环的复杂度=\(max \{\)所有并列的下一层循环的复杂度\(\}\).通俗点说,就是在某层循环中有分支的时候,这一层的复杂度=\(max \{\)所有分支的复杂度\(\}+\)本层复杂度. 最后复杂度=\(max \{\)所有的第一层循环复杂度\(\}\) 考虑到会有分支,所以我们采用递归来实现(当然其本质是栈,但是我不会写). 由于要使程序不至于\(RE\)

洛谷P3952 时间复杂度

题目:https://www.luogu.org/problemnew/show/3952 题目描述 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会来啦!下面请你编写程序来判断小明对他的每个程序给出的时间复杂度是否正确. A++语言的循环结构如下: F i x y 循环体 E 其中F i x y表示新建变量 i(变量 i 不可与未被销毁的变量重名)并初始化为 x, 然后判断 

【原创】洛谷 LUOGU P3366 【模板】最小生成树

P3366 [模板]最小生成树 题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包含两个整数N.M,表示该图共有N个结点和M条无向边.(N<=5000,M<=200000) 接下来M行每行包含三个整数Xi.Yi.Zi,表示有一条长度为Zi的无向边连接结点Xi.Yi 输出格式: 输出包含一个数,即最小生成树的各边的长度之和:如果该图不连通则输出orz 输入输出样例 输入样例#1: 4 5 1 2 2 1 3 2 1 4 3 2 3 4

NOIP 车站分级 (luogu 1983 &amp; codevs 3294 &amp; vijos 1851) - 拓扑排序 - bitset

描述 一条单向的铁路线上,依次有编号为 1, 2, ..., n 的 n 个火车站.每个火车站都有一个级别,最低为 1 级.现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车站 x,则始发站.终点站之间所有级别大于等于火车站 x 的都必须停靠.(注意:起始站和终点站自然也算作事先已知需要停靠的站点)例如,下表是 5 趟车次的运行情况.其中,前 4 趟车次均满足要求,而第 5 趟车次由于停靠了 3 号火车站(2 级)却未停靠途经的 6 号火车站(亦为 2 级)而不满足要求

[luogu]P3938 斐波那契[数学]

[luogu]P3938 斐波那契 题目描述 小 C 养了一些很可爱的兔子. 有一天,小 C 突然发现兔子们都是严格按照伟大的数学家斐波那契提出的模型来进行 繁衍:一对兔子从出生后第二个月起,每个月刚开始的时候都会产下一对小兔子.我们假定, 在整个过程中兔子不会出现任何意外. 小 C 把兔子按出生顺序,把兔子们从 1 开始标号,并且小 C 的兔子都是 1 号兔子和 1 号兔子的后代.如果某两对兔子是同时出生的,那么小 C 会将父母标号更小的一对优先标 号. 如果我们把这种关系用图画下来,前六个月

[Luogu] 运输计划--000

https://www.luogu.org/problemnew/show/P2680 题解: 二分一个答案x之后,只需要考虑m条路径中路径长度大于x的那些路径,并对那些路径求一个交.设m中最长路径为l,则只需判断路径交中的边是否存在一条边e使得e.w>=l-x.如何求交?其实我们树链剖分之后,只需用一个差分数组来维护每条边被多少条路径覆盖,只需考虑被覆盖的路径条数等于当前考虑的路径条数的边即可复杂度分析:差分数组的复杂度仅为O(1),总时间复杂度为O(nlognlogw),w<=3e8.由于

Luogu P3412 仓鼠找$sugar$ $II$

Luogu P3412 仓鼠找\(sugar\) \(II\) 题目大意: 给定一棵\(n\)个点的树, 仓鼠每次移动都会等概率选择一个与当前点相邻的点,并移动到此点. 现在随机生成一个起点.一个终点(可能相同). 仓鼠希望知道它从起点走到终点的期望步数是多少. 数据范围: 对于\(30\%\),\(n\leq 5\) 对于\(60\%\),\(n\leq 5\times 10^3\) 对于\(100\%\),\(n \leq 7\times 10^6\) 请将输出答案(一个分数)模上\(998