NOIP2017时间复杂度(大模拟)

传送门

大模拟是真的恶心。

题解我能说啥,就是模拟啊!

然后有几个坑点(可能只是对于我的打法吧)

1.注意数字可能为两位数,在处理出数字的时候注意一下(有18分)。

2.一旦某次循环进不去,接下来嵌套的循环就都是废的,打个标记。还要记录一下是哪一次,退出去的时候把标记去掉。(大概是18分)

3.发现ERR后不要直接return,存个标记,因为后面还有读入。(这个有8分)。

然后是丑陋的代码。

#include<bits/stdc++.h>
#define N 103
#define INF 2100000000
#define LL long long 
using namespace std;
int read()
{
    int x=0,f=1;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
    return x*f;
}
int T;
char s[10];
char op[2],I[2],X[2],Y[2];
int fzd,L;
int pre[N];//上次用的是哪个变量 
int vis[30];//看这个字母有没有用过 
int iss[N];//这重循环是否计入复杂度 
void work()
{
    int tot=0;
    int numF=0,numE=0;
    int xh=0;int flagg=0;
    int ans=0;int EEE=0;
    memset(vis,0,sizeof(vis));
    memset(iss,0,sizeof(iss));
    memset(pre,0,sizeof(pre));
    while(L--)
    {
        scanf("%s",op);
        if(op[0]=='F')numF++;
        else 
        {
            ans=max(ans,xh);
            if(iss[numF])xh--;
            iss[numF]=0;
            if(flagg==numF)flagg=0;
            numF--;
            if(numF<0){EEE=1;continue;}
            vis[pre[tot--]]=0;
            continue;
        }
        scanf("%s",I);
        if(vis[I[0]-'a']){EEE=1;continue;}
        else 
        {
            pre[++tot]=I[0]-'a';
            vis[I[0]-'a']=1;
        }
        scanf("%s",X);scanf("%s",Y);
        if(X[0]!='n')
        {
            if(Y[0]!='n')
            {
                int x=X[0]-'0';
                if(X[1]!=' ')x=x*10+X[1]-'0';
                int y=Y[0]-'0';
                if(Y[1]!=' ')y=y*10+Y[1]-'0';
                if(x>y)flagg=numF;
                iss[numF]=0;
            }
            else if(!flagg)xh++,iss[numF]=1;
        }
        else if(Y[0]!='n')flagg=numF,iss[numF]=0;
    }
    if(numF!=0)printf("ERR
");
    else if(EEE)printf("ERR
");
    else if(ans!=fzd)printf("No
");
    else printf("Yes
"); 
//    printf("%d
",ans);
}
int main()
{
    T=read();
    while(T--)
    {
        L=read();
        scanf("%s",s);
        if(s[2]=='1')fzd=0;
        else
        {
            fzd=s[4]-'0';
            if(s[5]!=')')
            fzd=fzd*10+s[5]-'0';
        } 
        work();
    }
} 
View Code
原文地址:https://www.cnblogs.com/yyys-/p/11848976.html