luogu 3952 時間複雜度(模擬)

2022-02-24 16:26:37 字數 1729 閱讀 5379

這道題從兩個月前開始做,一直沒做出來,最後今晚決心一定要做出來。於是開始認真的在打草紙上寫思路,最後在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...