這道題從兩個月前開始做,一直沒做出來,最後今晚決心一定要做出來。於是開始認真的在打草紙上寫思路,最後在ac的那一刻,差點哭了出來!!這個自己看吧,noip2017的d1t2
先介紹一下這道題我們用到的每個變數他們的用處
stack記錄變數的迴圈層
vis記錄變數在棧中是否出現過
cmp函式,這個可以用作比較迴圈中a和b的大小
\[\begin
a進入新的一層迴圈\\
a>b -> 無法進入新的迴圈,迴圈終止\\
a=b -> 此迴圈為o1
\\\end
\]stop 如果迴圈已經無法進入,那麼就用stop計數
ans表示最終的複雜度層數,maxn表示當前一層迴圈的複雜度層數
接下來是三種狀態的
err 條件
\[\begin
f、e不匹配\\
變數名重複
\\\end
\]no,yes均為題目定義
呼。然後就是**了
首先你得會字串處理一系列問題,如w,a,b之類的數字值,然後你得會普通的棧思想。
接下來第一步,我們如何處理複雜度問題。我的思路是分o1和on方的
o1你得判斷他的迴圈層數不得為正整數,然後判一下err就可以了。
on方的話,你要準確判斷他的迴圈層數
然後就是cmp函式,我的整段**的精妙就全在cmp函式裡了。
cmp函式判斷的是a和b的值。
首先如果b不是n,那麼他就不會形成乙個迴圈層
其次如果數為n,那麼就賦為inf
然後如果兩個數如果都是數字,那麼就為o1,直接按照相等處理
ac**!
#include #include #include #include using namespace std;
const int inf = 2147483647;
char s[200],a[200],b[200];
char stack[200];
char f,id;
int top;
bool vis[200],err;
int cmp(char *a,char *b)
if(top<0)err=true;
} else if(f=='f')
int flag=cmp(a,b);
if(flag==1) if(top>maxn)maxn++;
if(flag==-1) stop++;}}
if(top || err)
if(ans!=0)
printf("yes\n");
} if(s[2]=='n')
if(top<0)err=true;
} else if(f=='f')
int flag=cmp(a,b);
if(flag==1) if(top>=maxn+1)maxn++;
if(flag==-1) stop++;}}
if(top || err)
if(ans!=num)
printf("yes\n");
} }return 0;
}
tips:還有一件事請非常的重要,做模擬題之前,一定要理清思路,最好寫在紙上,因為碼量大的題目很容易會健忘,這樣會有以思維時間換**時間,垃圾思維大幅度縮短。
你會發現我曾經wa了無數發,都是沒有認真思考的結果!
題解 LuoGu3952 時間複雜度
原題傳送門 寫的我一口老血 你得先想好 什麼時候會err text err 然後你得知道當前的迴圈到底有沒有用 具體來說是這個迴圈的外面是否有類似 f i 100 1 或 f i n 100 text f i 100 1 或f i n 100 的情況那麼需要乙個記錄外面依然有幾個這樣的迴圈的變數ca...
P3952 時間複雜度
看到這種又是字串又是模擬的題目就很傷,很多的地方都考驗細節。看到這種處理迴圈的方式是後進先出,自然想到了用棧來模擬。但是最主要的思路是怎麼算複雜度?其實說白了也簡單 乙個迴圈的複雜度 這個迴圈本身的複雜度 在裡面巢狀的最大的複雜度 這裡的每乙個迴圈變數都是不重複的,如果重複直接判err。那麼我們就可...
模擬 洛谷 3952 時間複雜度
給出幾個語句,判斷它們的時間複雜度是否符合,如果是的話輸出 yes 不然輸出 no 編譯錯誤的話輸出 err 比較長的模擬。用乙個check判斷時間複雜度和是否有編譯錯誤,最後比較輸出。include include include include include using namespace s...