1. 程式人生 > >【 P3952】 時間複雜度 大模擬題解

【 P3952】 時間複雜度 大模擬題解

 

題目連結

 

 

完全模擬

1.模擬結果

當我們的模擬程式執行結束時,直接執行模擬結果函式,用於比對我們的結果和資料給出的結果。

 1 bool yes(char a[],char b[])
 2 {
 3     for(int i=0;i<=6;++i)
 4         if(a[i]!=b[i])
 5             return 0;
 6     return 1;
 7 }
 8 void print()
 9 {
10     memset(o,0,sizeof(o));
11     if((no1==1
&&mk==1)||(mk==0)){o[0]='O';o[1]='(';o[2]='1';o[3]=')';} 12 else 13 { 14 int mi1,mi10=0; 15 mi1=mk%10; 16 if(mk>=10) 17 {mi10=mk/10;o[0]='O';o[1]='(';o[2]='n';o[3]='^';o[4]=mi10+'0';o[5]=mi1+'0';o[6]=')';} 18 else 19 {o[0]='O';o[1]='(';o[2]='n';o[3
]='^';o[4]=mi1+'0';o[5]=')';} 20 } 21 if(error){cout<<"ERR"<<endl;return;} 22 if(yes(o,ok)){cout<<"Yes"<<endl;} 23 else{cout<<"No"<<endl;} 24 }
View Code

其中mi1儲存的是時間複雜度

o是我們結果的模擬,模擬出o(mi1)

ok是資料輸入的時間複雜度

2.模擬讀入過程

 1 void F(char,int
,int,bool); 2 void read() 3 { 4 char ii,xx[4],yy[4]; 5 memset(xx,0,sizeof(xx)); 6 memset(yy,0,sizeof(yy)); 7 cin>>ii>>xx>>yy; 8 int x,y; 9 int lenx=strlen(xx); 10 int leny=strlen(yy); 11 if(xx[0]=='n'&&yy[0]!='n') 12 { 13 x=100; 14 if(leny==2)y=(yy[0]-'0')*10+(yy[1]-'0'); 15 else y=(yy[0]-'0'); 16 F(ii,x,y,1); 17 } 18 else if(xx[0]!='n'&&yy[0]=='n') 19 { 20 if(lenx==2)x=(xx[0]-'0')*10+(xx[1]-'0'); 21 else x=(xx[0]-'0'); 22 y=100; 23 F(ii,x,y,0); 24 } 25 else 26 { 27 if(leny==2)y=(yy[0]-'0')*10+(yy[1]-'0'); 28 else y=(yy[0]-'0'); 29 if(lenx==2)x=(xx[0]-'0')*10+(xx[1]-'0'); 30 else x=(xx[0]-'0'); 31 F(ii,x,y,1); 32 no1=1; 33 } 34 35 }
View Code

運用遞迴方法,對於輸入的 F i j x只有三種情況。

(1) F i n x

時間複雜度要乘以n,所以直接模擬

(2) F n j x

由於n>j,之後的迴圈巢狀其實進不去,接下來要模擬一個上鎖的過程

(3) F i j x

常數級

3.模擬程式執行過程

 1 int main()
 2 {
 3     cin>>t;
 4     for(int i=1;i<=t;++i)
 5     {    
 6         mk=0;m=0;fm=0;error=0;no1=0;unlock=1;
 7         memset(ok,0,sizeof(ok));
 8         marki.erase(marki.begin(),marki.end());
 9         cin>>l;
10         cin>>ok;
11         while(l!=0)
12         {
13             mi=0;
14             unlock=1;
15             cin>>ht;    
16             if(ht=='F')
17             {    
18                 read();
19             }
20             else if(ht=='E')
21             {
22                 error=1;
23                 l--;
24             }
25         }
26         if(fm!=0)
27         {
28             error=1;
29         }
30         print();
31         
32     }
33     return 0;
34 }
View Code

主函式中輸入過程每一個小程式都輸入一遍

用一個map來存變數x的使用情況

當判到F時進行讀入,在F()函式中會判E

所以在主函式中當判到E時直接跳error,一定要記得l--

 1 void F(char i,int x,int y,bool o1)
 2 {
 3     if(l==1)
 4     {
 5         error=1;
 6     }l--;
 7     
 8     if(marki[i]==1)
 9     {
10         error=1;
11     }
12     marki[i]=1;
13     if(fm!=0&&fm==mi)
14     {unlock=1;}    
15     if(o1!=1){m++;}fm++;
16 
17     if(x>y)
18     {unlock=0;}
19     if(unlock)mi=max(m,mi);
20     while(l!=0)
21     {    
22         cin>>ht;
23         if(ht=='F')
24         {
25             read();
26         }
27         else if(ht=='E')
28         {
29             l--;
30             if(o1!=1)
31             {
32                 m--;
33             }
34             fm--;
35             if(m==0)
36             {    
37                 mk=max(mi,mk);
38                 mi=0;
39             }
40             marki.erase(i);
41             return;
42         }
43     }
44 }
View Code

其中的error就是各個錯誤過程,用了一個unlock去鎖住進不去的迴圈

用了m去存實際除去進入迴圈的層數,用mi去每次取出

用了fm去存包括進不去的迴圈在內的層數

fm回到鎖前的mi時解鎖

 

完整程式碼

 

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<map>
  4 #include<stack>
  5 #include<cstring>
  6 using namespace std;
  7 map<char,bool>marki;
  8 bool error;
  9 int m,fm;
 10 int mi,mk;
 11 bool no1;
 12 char o[8];
 13 char ok[8];    
 14 int t,l;
 15 char ht;
 16 char I;
 17 int X,Y;
 18 bool unlock;
 19 bool yes(char a[],char b[])
 20 {
 21     for(int i=0;i<=6;++i)
 22         if(a[i]!=b[i])
 23             return 0;
 24     return 1;
 25 }
 26 void F(char,int,int,bool);
 27 void read()
 28 {
 29     char ii,xx[4],yy[4];
 30     memset(xx,0,sizeof(xx));
 31     memset(yy,0,sizeof(yy));
 32     cin>>ii>>xx>>yy;
 33     int x,y;
 34     int lenx=strlen(xx);
 35     int leny=strlen(yy);
 36     if(xx[0]=='n'&&yy[0]!='n')
 37     {
 38         x=100;
 39         if(leny==2)y=(yy[0]-'0')*10+(yy[1]-'0');
 40         else y=(yy[0]-'0');
 41         F(ii,x,y,1);
 42     }
 43     else if(xx[0]!='n'&&yy[0]=='n')
 44     {
 45         if(lenx==2)x=(xx[0]-'0')*10+(xx[1]-'0');
 46         else x=(xx[0]-'0');
 47         y=100;
 48         F(ii,x,y,0);
 49     }
 50     else
 51     {
 52         if(leny==2)y=(yy[0]-'0')*10+(yy[1]-'0');
 53         else y=(yy[0]-'0');
 54         if(lenx==2)x=(xx[0]-'0')*10+(xx[1]-'0');
 55         else x=(xx[0]-'0');
 56         F(ii,x,y,1);
 57         no1=1;
 58     }
 59     
 60 }
 61 void F(char i,int x,int y,bool o1)
 62 {
 63     if(l==1)
 64     {
 65         error=1;
 66     }l--;
 67     
 68     if(marki[i]==1)
 69     {
 70         error=1;
 71     }
 72     marki[i]=1;
 73     if(fm!=0&&fm==mi)
 74     {unlock=1;}    
 75     if(o1!=1){m++;}fm++;
 76 
 77     if(x>y)
 78     {unlock=0;}
 79     if(unlock)mi=max(m,mi);
 80     while(l!=0)
 81     {    
 82         cin>>ht;
 83         if(ht=='F')
 84         {
 85             read();
 86         }
 87         else if(ht=='E')
 88         {
 89             l--;
 90             if(o1!=1)
 91             {
 92                 m--;
 93             }
 94             fm--;
 95             if(m==0)
 96             {    
 97                 mk=max(mi,mk);
 98                 mi=0;
 99             }
100             marki.erase(i);
101             return;
102         }
103     }
104 }
105 void print()
106 {
107     memset(o,0,sizeof(o));
108     if((no1==1&&mk==1)||(mk==0)){o[0]='O';o[1]='(';o[2]='1';o[3]=')';}
109     else
110     {
111         int mi1,mi10=0;
112         mi1=mk%10;
113         if(mk>=10)
114         {mi10=mk/10;o[0]='O';o[1]='(';o[2]='n';o[3]='^';o[4]=mi10+'0';o[5]=mi1+'0';o[6]=')';}
115         else
116         {o[0]='O';o[1]='(';o[2]='n';o[3]='^';o[4]=mi1+'0';o[5]=')';}
117     }
118     if(error){cout<<"ERR"<<endl;return;}
119     if(yes(o,ok)){cout<<"Yes"<<endl;}
120     else{cout<<"No"<<endl;}
121 }
122 int main()
123 {
124     cin>>t;
125     for(int i=1;i<=t;++i)
126     {    
127         mk=0;m=0;fm=0;error=0;no1=0;unlock=1;
128         memset(ok,0,sizeof(ok));
129         marki.erase(marki.begin(),marki.end());
130         cin>>l;
131         cin>>ok;
132         while(l!=0)
133         {
134             mi=0;
135             unlock=1;
136             cin>>ht;    
137             if(ht=='F')
138             {    
139                 read();
140             }
141             else if(ht=='E')
142             {
143                 error=1;
144                 l--;
145             }
146         }
147         if(fm!=0)
148         {
149             error=1;
150         }
151         print();
152         
153     }
154     return 0;
155 }
Code