洛谷P3952 时间复杂度

题目描述:

小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会来啦!下面请你编写程序来判断小明对他的每个程序给出的时间复杂度是否正确。

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

F i x y
    循环体
E

其中F i x y表示新建变量 ii(变量 ii 不可与未被销毁的变量重名)并初始化为 xx, 然后判断 ii 和 yy 的大小关系,若 ii 小于等于 yy 则进入循环,否则不进入。每次循环结束后 ii 都会被修改成 i +1i+1,一旦 ii 大于 yy 终止循环。

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

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

注:本题中为了书写方便,在描述复杂度时,使用大写英文字母“O”表示通常意义下“Θ”的概念。

题解:

大模拟,坑点不少。。。

附上代码:

#include<cstdio>
#include<cstring> 
#define M(K) memset(K,0,sizeof(K))
int t,k,cnt,kpl2,bin[101],flag,idx,flag2,z2,cnt2[101],m,flag3,idx2,y,x,idx5,idx3,max,kpl,cnt3,cnt4[101],idx4;
char a[5],b[5],c[5],d[5],e[5],f[5];
int main()
{
    scanf("%d",&t);
    for(int z=1;z<=t;z++)
    {
        cnt=flag=flag2=flag3=max=kpl=cnt3=m=idx=kpl2=idx2=z2=0;
        idx3=idx4=idx5=1;
        M(cnt4),M(c),M(f),M(cnt2),M(bin);
        scanf("%d%s",&k,a);
        int l=strlen(a);
        for(int i=0;i<l;i++) 
        {
            if(a[i]<='9'&&a[i]>='0')
                idx=idx*10+a[i]-'0';
            if(a[i]=='n')
                flag=1;
        }
        for(int i=1;i<=k;i++)
        {
            scanf("%s",b);
            if(b[0]=='F')
            {
                x=y=0;
                if(cnt==0)
                    m=0,kpl2=0; 
                if(m==1)
                    m=0,idx3++,cnt2[idx3]=cnt2[idx3-1]-z2;
                idx5=z2=0;
                scanf("%s%s%s",c,d,e);
                if(cnt==0&&i!=1)
                    idx3++; 
                for(int j=1;j<=idx2;j++)
                    if(f[j]==c[0])
                        flag2=1;
                for(int j=0;j<strlen(e);j++)
                    if(e[j]!='n')
                        y=y*10+e[j]-'0';
                for(int j=0;j<strlen(d);j++)
                    if(d[j]!='n')
                        x=x*10+d[j]-'0';
                if(e[0]=='n'&&y==0)
                    y=1000;
                if(d[0]=='n'&&x==0)
                    x=1000;
                if(x<=y&&kpl2==0)
                {
                    if(e[0]=='n'&&kpl==0&&d[0]!='n')
                    {
                        cnt2[idx3]++;
                        bin[i]=1;
                    }   
                    if(d[0]=='n'&&i==1)
                        kpl=1;
                }
                else
                    kpl2=1;
                f[++idx2]=c[0],cnt++,cnt3=0;      
            }
            if(b[0]=='E')
            {
                cnt--,idx2--,idx5++;
                if(bin[i-idx5]==1)
                {
                    z2++;
                    idx5++; 
                }   
                else
                    z2=0;
                if(z!=0&&cnt!=0)
                {
                    if(m!=1)
                    {
                        idx3++;
                        cnt2[idx3]=cnt2[idx3-1];    
                    }   
                    m=1;
                }
                if(cnt==0)
                {
                    cnt3=0;
                    if(cnt4[idx4]>cnt2[idx3])
                        cnt2[idx3]=cnt4[idx4];
                    idx4++;     
                }               
            }
        }
        for(int i=1;i<=idx3;i++)
            if(max<cnt2[i])
                max=cnt2[i];
        if(flag3==0)
        {
            if(cnt!=0||flag2==1)
                printf("ERR
");
            else
            {
                if(max==0)
                {
                    if(idx==1&&flag==0)
                        printf("Yes
");
                    else
                        printf("No
");
                }
                else
                {
                    if(idx==max&&flag==1)
                        printf("Yes
");
                    else
                        printf("No
");
                }   
            }   
        } 
    }
}
原文地址:https://www.cnblogs.com/jiangminghong/p/9816866.html