noip 2017 时间复杂度

自认为是少有的复杂的代码

这题思想很简单,就是大模拟

对于for循环,一行读入4个字符串,然后分类讨论:

①:如果是一个正常的O(n),那么累计n的指数加1

②:如果是一个常数级别的,那么继续循环,但是不累计指数

③:如果这个循环是从n到常数,或大常数到小常数,那么这个循环及它内部的循环都不进,打好标记不要累计

④:至于如何防止变量的重复使用:将用过的变量放进栈里并打上标记,循环结束时出栈清标记即可

⑤:还要注意一些小细节:循环层数只计最深的一层,所以我们用一个累计变量cnt,每次结束循环考虑循环的情况:如果这个循环被累计了,cnt--,否则cnt不变,所以我们还要开一个栈,记录每个循环的情况(与存变量的栈同步使用即可)

剩下就好办了:

#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
char s[10];
char s1[10],s2[10];
char tt[10];
bool used[130];
int n;
stack <char> Q;
stack <int> M;
int main()
{
    scanf("%d",&n);
    while(n--)
    {
        int l;
        scanf("%d",&l);
        scanf("%s",tt);
        int flag=0;
        int flag0=0;
        int flag2=0;
        int cnt=0,maxcnt=0;
        memset(used,0,sizeof(used));
        while(!M.empty())
        {
            M.pop();
            Q.pop();
        }
        for(int i=1;i<=l;i++)
        {
            scanf("%s",s);
            if(flag0)
            {
                if(s[0]=='F')
                {
                    scanf("%s",s);
                    scanf("%s",s);
                    scanf("%s",s);
                }
                continue;
            }
            if(s[0]=='E')
            {
                if(!flag)
                {
                    flag0=1;
                    continue;
                }else
                {
                    char c=Q.top();
                    used[c]=0;
                    Q.pop();
                    flag--;
                    int y=M.top();
                    if(y==1)
                    {
                        cnt--;
                    }else if(y==2)
                    {
                        flag2=0;
                    }
                    M.pop();
                }
            }else
            {
                scanf("%s",s);
                if(used[s[0]])
                {
                    flag=1;
                    scanf("%s",s);
                    scanf("%s",s);
                    continue;
                }
                used[s[0]]=1;
                Q.push(s[0]);
                scanf("%s",s1);
                scanf("%s",s2);
                flag++;
                if(s1[0]-'0'<=9&&s2[0]-'0'<=9&&s1[0]-'0'>=0&&s2[0]-'0'>=0)
                {
                    int j=0;
                    int x=0;
                    while(s1[j]-'0'<=9&&s1[j]-'0'>=0)
                    {
                        x=x*10+s1[j]-'0';
                        j++;
                    }
                    int y=0;
                    j=0;
                    while(s2[j]-'0'<=9&&s2[j]-'0'>=0)
                    {
                        y=y*10+s2[j]-'0';
                        j++;
                    }
                    if(x>y)
                    {
                        flag2=1;
                        M.push(2);
                    }else
                    {
                        M.push(0);
                    }
                    continue;
                }else if(s2[0]-'0'<=9&&s2[0]-'0'>=0)
                {
                    M.push(2);
                    flag2=1;
                    continue;
                }else
                {
                    if(s2[0]=='n'&&s1[0]=='n')
                    {
                        M.push(0);
                        continue;
                    }
                    if(!flag2)
                    {
                        cnt++;
                        M.push(1);
                    }else
                    {
                        M.push(0);
                    }
                    maxcnt=max(maxcnt,cnt);
                }
            }
        }
        if(flag)
        {
            flag0=1;
        }
        if(flag0)
        {
            printf("ERR\n");
            continue;
        }else if(maxcnt==0&&tt[2]=='1')
        {
            printf("Yes\n");
            continue;
        }else
        {
            int j=4;
            int x=0;
            while(tt[j]-'0'<=9&&tt[j]-'0'>=0)
            {
                x=x*10+tt[j]-'0';
                j++;
            }
            if(x==maxcnt)
            {
                printf("Yes\n");
                continue;
            }
            printf("No\n");
            continue;
        }
    }
    return 0;
}

 

posted @ 2018-09-28 16:08  lleozhang  Views(180)  Comments(0Edit  收藏  举报
levels of contents