1. 程式人生 > >NOIP 2017 Day1 T2 時間複雜度

NOIP 2017 Day1 T2 時間複雜度

題意:自己看吧

演算法:模擬

難度:NOIP+

程式碼如下:

應該對您沒有什麼幫助

#include <cstdio>
#include <iostream> 
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <cmath>
#include <map>
#include <algorithm>
#define ll long long
using namespace std;
map<int,int>Mbianliang;
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        Mbianliang.clear();
        char OOO[15];
        int L;
        scanf("%d",&L);
        getchar();
        getchar();
        getchar();
        int tim=0;
        char q;
        q=getchar();
        if(q=='n')
        {
            getchar();
            scanf("%s",OOO+1);
            int uio=strlen(OOO+1)-1;
            if(uio==2)
            {
                tim+=(OOO[1]-48)*10;
                tim+=OOO[2]-48;
            }else
            {
                tim=OOO[1]-48;
            }
            tim+=123;
        }else
        {
            tim=1;
        }
        gets(OOO);	
        /*if(OOO[3]=='1') tim=1;
        else if(OOO[3]=='n') tim=OOO[5]-48,tim+=123;*/
        char rrr[15];
        int fla=0;
        char bbll[105];
        int ttn=0;
        int lj=0,ljj=0;
        int maxn=0;
        for(int i = 1;i <= L;i++)
        {
        	int ii=i;
            scanf("%s",rrr+1);
            if(rrr[1]=='F')
            {
                getchar();
                char qw;
                scanf("%c",&qw);
                bbll[++ttn]=qw;
                if(Mbianliang[qw]) fla=1;
                else Mbianliang[qw]=1;
                char x[5],y[5];
                /*getchar();
                scanf("%c",&x);
                getchar();
                scanf("%c",&y);*/
                scanf("%s%s",x+1,y+1);
                int len=strlen(x+1);
                int ln=strlen(y+1);
                int aa=0,bb=0;
                if(len==1&&ln==1)
                {
                    int nnn=0;
                    int nnnn=0;
                    if(x[1]-48>53) nnn=123;
                    else nnn=x[1]-48;
                    if(y[1]-48>53) nnnn=123;
                    else nnnn=y[1]-48;
                    //if(nnn==nnnn) lj=0;
                    //if(nnn<20&&nnn<20) lj=0;
                    if(nnn>nnnn)
                    {
                    	ljj++;
                    	int tuy=1;
                        char str[10];
                        gets(str);
                        for(int j = i+1;j <= L;j++)
                        {
                        	if(!tuy)
                        	{
                            	i=j-1;
                            	break;
                            }
                            maxn=max(maxn,lj);
                            scanf("%s",str+1);
                            if(str[1]=='E') ljj--,Mbianliang[bbll[ttn]]=0,ttn--,tuy--;
                            if(str[1]=='F') tuy++,ljj++;
                            if(str[1]=='F')
							{
								getchar();
								scanf("%s",str+1);
								bbll[++ttn]=str[1];
								if(Mbianliang[str[1]]) fla=1;
	                			else Mbianliang[str[1]]=1;
							}
                            gets(str);
                            if(!tuy)
                        	{
                            	i=j;
                            	break;
                            }
                        }
                        //break;
                    }
                    if(i!=ii) goto loop;
                    //if(nnn==123&&nnnn==123) lj=0;
                    if(nnn==123||nnnn==123)
                    {
                        if(nnn==123&&nnnn==123) {}
                        else lj++;
                    }
                    
                }else if(len==1)
                {
                    //if(x[1]-48>53) goto lop;
                    //else
                    {
                    	ljj++;
                        if(ln==3)
                        {
                            bb+=(y[1]-48)*100;
                            bb+=(y[2]-48)*10;
                            bb+=(y[3]-48)*1;
                        }else if(ln==2)
                        {
                            bb+=(y[1]-48)*10;
                            bb+=(y[2]-48)*1;
                        }
                        aa=x[1]-48;
                    }
                }else if(ln==1)
                {
                    if(y[1]-48>53) lj++;
                    else
                    {
                    	ljj++;
                        if(len==3)
                        {
                            aa+=(x[1]-48)*100;
                            aa+=(x[2]-48)*10;
                            aa+=(x[3]-48)*1;
                        }else if(len==2)
                        {
                            aa+=(x[1]-48)*10;
                            aa+=(x[2]-48)*1;
                        }
                        bb=y[1]-48;
                    }
                }else
                {
                	ljj++;
                    if(len==3)
                    {
                        aa+=(x[1]-48)*100;
                        aa+=(x[2]-48)*10;
                        aa+=(x[3]-48)*1;
                    }else if(len==2)
                    {
                        aa+=(x[1]-48)*10;
                        aa+=(x[2]-48)*1;
                    }
                    if(ln==3)
                    {
                        bb+=(y[1]-48)*100;
                        bb+=(y[2]-48)*10;
                        bb+=(y[3]-48)*1;
                    }else if(ln==2)
                    {
                        bb+=(y[1]-48)*10;
                        bb+=(y[2]-48)*1;
                    }	
                }
                if(aa>bb)
                {
                	//ljj++;
                    char str[10];
                gets(str);
                    int tuy=1;
                    for(int j = i+1;j <= L;j++)
                    {
                    	if(!tuy)
                    	{
                        	i=j-1;
                        	break;
                        }
                        maxn=max(maxn,lj);
                        scanf("%s",str+1);
                        if(str[1]=='E') ljj--,Mbianliang[bbll[ttn]]=0,ttn--,tuy--;
                        if(str[1]=='F') tuy++,ljj++;
                        if(str[1]=='F')
						{
							getchar();
							scanf("%s",str+1);
							bbll[++ttn]=str[1];
							if(Mbianliang[str[1]]) fla=1;
                			else Mbianliang[str[1]]=1;
						}
                        gets(str);
                        if(!tuy)
                    	{
                        	i=j;
                        	break;
                        }
                    }
                    //break;
                }
                //if(i!=ii) continue;
            }
loop:       maxn=max(maxn,lj);
            if(rrr[1]=='E')
            {
                Mbianliang[bbll[ttn]]=0;
                ljj--;
                ttn--;
            }
             if(ljj<0) lj+=ljj,ljj=0;
            if(i==L&&ttn) fla=1; 
            
        }		
        if(ttn!=0) fla=1;
        if(fla) puts("ERR");
        else if(tim>101)
        {
            if(tim-123==maxn) puts("Yes");
            else puts("No");
        }else if(tim==1)
        {
            puts("Yes");
        }
    }
    return 0 ;
}