[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;
}
原文地址:https://www.cnblogs.com/LiGuanlin1124/p/9723843.html