zoukankan      html  css  js  c++  java
  • 洛谷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
    ");
                    }   
                }   
            } 
        }
    }
  • 相关阅读:
    C语言培训06
    C语言培训07
    C语言培训10 (完结篇)
    c程序设计语言 读书笔记01
    Open Xml Sdk创建目录
    D3D管线中每个stage的含义
    关于 STL::list 保存对象的一些注意
    【转载】 MultiByteToWideChar和WideCharToMultiByte用法详解
    Oracle GoldenGate 11G同步配置
    Linux挂载大硬盘(大于2T)
  • 原文地址:https://www.cnblogs.com/jiangminghong/p/9816866.html
Copyright © 2011-2022 走看看