• 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
  • 相关阅读:
    第六次作业--结对编程
    第四次作业--项目选题报告(团队)
    Eclipse和JDK的安装配置
    最大最小
    文档
    火车
    排队
    击鼓传花
    逆序数
    塔防——链表的基本操作
  • 原文地址:https://www.cnblogs.com/yyys-/p/11848976.html
Copyright © 2020-2023  润新知