luogu 3952 时间复杂度

Posted jack_yyc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luogu 3952 时间复杂度相关的知识,希望对你有一定的参考价值。

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

题目大意:

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

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

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

F i x y
    循环体
E

其中F i x y表示新建变量i(变量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 }
View Code

 



以上是关于luogu 3952 时间复杂度的主要内容,如果未能解决你的问题,请参考以下文章

luogu 3952 时间复杂度

luogu 3952 时间复杂度(模拟)

luogu P3952 时间复杂度题解

洛谷P3952 时间复杂度

LOJ P3952 时间复杂度 noip 暴力 模拟

P3952 时间复杂度