zoukankan      html  css  js  c++  java
  • [NOIP2017]时间复杂度

    题目大意:给出多个程序以及其时间复杂度,判断'Yes','No'或'ERR'。

    做法:

    这种做法比较耗时,但是稳。

    每次读进来一个程序,先check是否ERR,然后深搜求解其时间复杂度。

    没什么好说的,上代码:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int T,L;
    char ch[105][105];
    int s[105],tl;
    bool use[28];
    void p1(){printf("Yes
    ");}
    void p2(){printf("No
    ");}
    void p3(){printf("ERR
    ");}
    bool check()
    {
        for(int i=1;i<=L;i++)
        {
            if(ch[i][1]=='F')
            {
                for(int j=1;j<=20;j++)
                {
                    if(ch[i][j]>='a'&&ch[i][j]<='z')
                    {
                        int c = ch[i][j]-'a'+1;
                        if(use[c])return 0;
                        use[c]=1;
                        s[++tl]=c;
                        break;
                    }
                }
            }else
            {
                if(tl==0)return 0;
                use[s[tl]]=0;
                tl--;
            }
        }
        if(tl!=0)return 0;
        return 1;
    }
    int dfs(int l,int r)
    {
        int ret = 0;
        if(l>r)return 0;
        int fr = l,cnt=0;
        for(int i=l;i<=r;i++)
        {
            if(ch[i][1]=='F')cnt++;
            else cnt--;
            if(!cnt)
            {
                int tim1=0,tim2=0,spa=0;
                for(int j=1;j<=20;j++)
                {
                    if(!spa)
                    {
                        if(ch[fr][j]>='0'&&ch[fr][j]<='9')
                        {
                            tim1=10*tim1+ch[fr][j]-'0';
                        }
                        if(ch[fr][j]=='n')tim1=1124;
                    }
                    if(tim1&&!spa&&ch[fr][j]==' ')spa=1;
                    if(spa)
                    {
                        if(ch[fr][j]>='0'&&ch[fr][j]<='9')
                        {
                            tim2=10*tim2+ch[fr][j]-'0';
                        }
                        if(ch[fr][j]=='n')tim2=1124;
                    }
                    if(tim2&&ch[fr][j]==' ')break;
                }
                if(tim1>tim2)continue;
                int tmp = dfs(fr+1,i-1);
                if(tim2==1124&&tim1!=1124)tmp++;
                ret=max(ret,tmp);
                fr=i+1;
            }
        }
        return ret;
    }
    void mk()
    {
        memset(use,0,sizeof use);
        memset(ch,'',sizeof ch);
        scanf("%d %s",&L,ch[0]+1);
        int len;
        tl=0;
        len = strlen(ch[0]+1);
        int f=0,s=0;
        for(int i=1;i<=len;i++)
        {
            if(ch[0][i]=='n')f=1;
            if(f&&ch[0][i]>='0'&&ch[0][i]<='9')s=10*s+ch[0][i]-'0';
        }
        gets(ch[0]+1);
        for(int i=1;i<=L;i++)
            gets(ch[i]+1);
        if(!check())
        {
            p3();
            return ;
        }
        int ans = dfs(1,L);
        if(!ans&&!f){p1();return;}
        if(ans&&ans==s){p1();return;}
        p2();
    }
    int main()
    {
        scanf("%d",&T);
        for(int i=1;i<=T;i++)
            mk();
        return 0;
    }
  • 相关阅读:
    Mysql中use filesort的误区
    Windows双系统
    Java visualvm
    软件设计师06-数据结构
    安装VMware14可能出现的问题
    计算机硬件系统
    Web漏洞扫描
    crunch制作字典
    kali之HexorBase数据库破解
    memcahce 介绍以及安装以及扩展的安装
  • 原文地址:https://www.cnblogs.com/LiGuanlin1124/p/9723843.html
Copyright © 2011-2022 走看看