NOIP2017 時間複雜度

2022-05-05 17:48:11 字數 1827 閱讀 2376

傳送門

這道題我去年做到**,最後還是爆零了,現在我還是特別慢才寫完……

唯一不同就是現在思路比較清晰,但是我的做法比較複雜,**很長。

我們要處理以下事情:

1.讀入程式行數,得到該程式時間複雜度。

這個很簡單,我的方法是寫乙個函式判斷一下,然後返回當前時間,如果是常數級就是0.

2.讀入程式,判斷是否合法。

這一步判斷只需要判斷變數是否重複即可,不合法直接退出。

3.判斷能否進入這次迴圈。

因為scanf遇到空格會停下,所以我直接使用string來處理。我們要處理的其實就是乙個數和n,我寫了乙個函式進行判斷。

4.如果不能進入迴圈,進入查錯狀態。

如果不能迴圈,那麼裡面的**沒什麼用,只能查錯。這個還是很舒服的,因為裡面就不用考慮能不能進入迴圈,只考慮是否合法即可。還是自寫了乙個函式進行判斷,只判斷變數名重複。之後如果當前棧頂比進來的時候還少,那就從查錯狀態中返回。

5.能進入迴圈,進行壓棧,更新答案。

6.判斷迴圈結束。

這個也很簡單,每次把棧還原即可。

7.判斷合法。

如果程式結束的時候棧中還有元素或棧中無元素還在往外彈,那就不合法。

注意因為我的方法是直接跳出,所以即使程式不合法也要全部讀完。

8.輸出結果。

其他注意事項是注意每次保險起見清空陣列,之後要記錄當前讀到哪了,查錯和普通狀態下都要++。

感覺自己臨近noip碼力仍然很弱……時間不多了。

看一下**。

#include#include

#include

#include

#include

#include

#define rep(i,a,n) for(int i = a;i <= n;i++)

#define per(i,n,a) for(int i = n;i >= a;i--)

#define enter putchar('\n')

#define pr pair#define mp make_pair

#define fi first

#define sc second

using

namespace

std;

typedef

long

long

ll;const

int m = 100005

;const

int n = 10000005;

intread()

while(ch >='

0' && ch <= '9'

)

return ans *op;

}int t,l,sta[1005],top,maxn,maxt,csta[1005

],ctop,sen;

bool vis[105

];string

s,vari,fir,la;

void

clear()

intcaltime()

bool

illegal()

bool

in()

bool

addtime()

bool

check()

else

if(s[0] == 'e'

)

}}bool solve(int l,int

ctim)

else

}else

}if(top) return0;

return1;

}int

main()

}return0;

}

NOIP2017 時間複雜度

最近做的最簡單的一道模擬題orz 終於把noip2017的都搞完了。這道理有幾個需要注意的小細節 1.注意 f i n n的情況,相當與常數。2.在不迴圈的部分也要記得判斷是否重複變數 3.兩個常數的時候記得比大小 其他也就沒啥了。考noip2017的時候棧是什麼都不知道,只知道zz模擬,也不知道怎...

NOIP 2017 時間複雜度

題目鏈結 去年考試這道題貌似20分 今天又寫,怒幹1個半小時,一次ac 重點是靜下心來,理清思路,知道要幹什麼 然後慢慢地查錯 之後自己造一些比較難的資料來測 這種細節巨多的題就要靜下來,就好了 include define rep i,a,b for register int i a i b i ...

NOIP2017 時間複雜度

堪稱史上最噁心的模擬題!花了我幾乎一天時間才調出來。思路沒啥好說的,開棧模擬即可,細節說一說。1 每次處理乙個新的程式時,將所有該初始化的都初始化,這點估計都能想到。2 關於讀入語句,可以一次讀一行,也可以分開讀,建議分成三個變數讀,我用的一次讀一行,坑死了!不過趁機學了一下c 關於讀入行的知識,c...