P3952 时间复杂度(模拟)
https://www.luogu.org/problem/P3952
題目描述
小明正在學(xué)習(xí)一種新的編程語(yǔ)言 A++,剛學(xué)會(huì)循環(huán)語(yǔ)句的他激動(dòng)地寫了好多程序并 給出了他自己算出的時(shí)間復(fù)雜度,可他的編程老師實(shí)在不想一個(gè)一個(gè)檢查小明的程序, 于是你的機(jī)會(huì)來(lái)啦!下面請(qǐng)你編寫程序來(lái)判斷小明對(duì)他的每個(gè)程序給出的時(shí)間復(fù)雜度是否正確。
A++語(yǔ)言的循環(huán)結(jié)構(gòu)如下:
F i x y循環(huán)體 E其中F i x y表示新建變量 ii(變量 ii 不可與未被銷毀的變量重名)并初始化為 xx, 然后判斷 ii 和 yy 的大小關(guān)系,若 ii 小于等于 yy 則進(jìn)入循環(huán),否則不進(jìn)入。每次循環(huán)結(jié)束后 ii 都會(huì)被修改成 i +1i+1,一旦 ii 大于 yy 終止循環(huán)。
xx 和 yy 可以是正整數(shù)(xx 和 yy 的大小關(guān)系不定)或變量 nn。nn 是一個(gè)表示數(shù)據(jù)規(guī)模的變量,在時(shí)間復(fù)雜度計(jì)算中需保留該變量而不能將其視為常數(shù),該數(shù)遠(yuǎn)大于 100100。
“E”表示循環(huán)體結(jié)束。循環(huán)體結(jié)束時(shí),這個(gè)循環(huán)體新建的變量也被銷毀。
注:本題中為了書寫方便,在描述復(fù)雜度時(shí),使用大寫英文字母“O”表示通常意義下“Θ”的概念。
輸入格式
輸入文件第一行一個(gè)正整數(shù) tt,表示有 tt(t \le 10t≤10)個(gè)程序需要計(jì)算時(shí)間復(fù)雜度。 每個(gè)程序我們只需抽取其中 F i x y和E即可計(jì)算時(shí)間復(fù)雜度。注意:循環(huán)結(jié)構(gòu) 允許嵌套。
接下來(lái)每個(gè)程序的第一行包含一個(gè)正整數(shù) LL 和一個(gè)字符串,LL 代表程序行數(shù),字符 串表示這個(gè)程序的復(fù)雜度,O(1)表示常數(shù)復(fù)雜度,O(nw)表示復(fù)雜度為nwn
w
,其 中w是一個(gè)小于100的正整數(shù)(輸入中不包含引號(hào)),輸入保證復(fù)雜度只有O(1)和O(n^w) 兩種類型。
接下來(lái) LL 行代表程序中循環(huán)結(jié)構(gòu)中的F i x y或者 E。 程序行若以F開(kāi)頭,表示進(jìn)入一個(gè)循環(huán),之后有空格分離的三個(gè)字符(串)i x y, 其中 ii 是一個(gè)小寫字母(保證不為nn),表示新建的變量名,xx 和 yy 可能是正整數(shù)或 nn ,已知若為正整數(shù)則一定小于 100。
程序行若以E開(kāi)頭,則表示循環(huán)體結(jié)束。
輸出格式
輸出文件共 tt 行,對(duì)應(yīng)輸入的 tt 個(gè)程序,每行輸出Yes或No或者ERR(輸出中不包含引號(hào)),若程序?qū)嶋H復(fù)雜度與輸入給出的復(fù)雜度一致則輸出Yes,不一致則輸出No,若程序有語(yǔ)法錯(cuò)誤(其中語(yǔ)法錯(cuò)誤只有: ① F 和 E 不匹配 ②新建的變量與已經(jīng)存在但未被銷毀的變量重復(fù)兩種情況),則輸出ERR 。
注意:即使在程序不會(huì)執(zhí)行的循環(huán)體中出現(xiàn)了語(yǔ)法錯(cuò)誤也會(huì)編譯錯(cuò)誤,要輸出 ERR。
輸入輸出樣例
輸入 #1 復(fù)制
輸出 #1 復(fù)制
Yes Yes ERR Yes No Yes Yes ERR說(shuō)明/提示
【輸入輸出樣例解釋1】
第一個(gè)程序 ii 從 1 到 1 是常數(shù)復(fù)雜度。
第二個(gè)程序 xx 從 1 到 nn 是 nn 的一次方的復(fù)雜度。
第三個(gè)程序有一個(gè) F 開(kāi)啟循環(huán)卻沒(méi)有 E 結(jié)束,語(yǔ)法錯(cuò)誤。
第四個(gè)程序二重循環(huán),nn 的平方的復(fù)雜度。
第五個(gè)程序兩個(gè)一重循環(huán),nn 的一次方的復(fù)雜度。
第六個(gè)程序第一重循環(huán)正常,但第二重循環(huán)開(kāi)始即終止(因?yàn)閚n遠(yuǎn)大于100,100大于4)。
第七個(gè)程序第一重循環(huán)無(wú)法進(jìn)入,故為常數(shù)復(fù)雜度。
第八個(gè)程序第二重循環(huán)中的變量 xx 與第一重循環(huán)中的變量重復(fù),出現(xiàn)語(yǔ)法錯(cuò)誤②,輸出 ERR。
【數(shù)據(jù)規(guī)模與約定】
對(duì)于 30%30%的數(shù)據(jù):不存在語(yǔ)法錯(cuò)誤,數(shù)據(jù)保證小明給出的每個(gè)程序的前 L/2L/2 行一定為以 F 開(kāi)頭的語(yǔ)句,第 L/2+1L/2+1 行至第 LL 行一定為以 EE 開(kāi)頭的語(yǔ)句,L \le 10L≤10,若 xx、yy 均 為整數(shù),xx 一定小于 yy,且只有 yy 有可能為 nn。
對(duì)于 50%50%的數(shù)據(jù):不存在語(yǔ)法錯(cuò)誤,L \le 100L≤100,且若 xx、yy 均為整數(shù),xx 一定小于 yy, 且只有 yy 有可能為 nn。
對(duì)于 70%70%的數(shù)據(jù):不存在語(yǔ)法錯(cuò)誤,L \le 100L≤100。
對(duì)于 100%100%的數(shù)據(jù):L \le 100L≤100。
/*
本題首先要統(tǒng)一使用O(n^m)的形式來(lái)表達(dá)時(shí)間復(fù)雜度,O(1) =O(n^0).
每一條F語(yǔ)句都可以算出一個(gè)m值。
我們可以發(fā)現(xiàn),這些F語(yǔ)句與E的配對(duì)類似我們遇到的括號(hào)匹配問(wèn)題。
那么我們就把它當(dāng)做括號(hào)匹配吧:
我們需要維護(hù)一個(gè)類似棧的東東.
同時(shí)明確語(yǔ)法錯(cuò)誤的情況:
1.F 與 E的個(gè)數(shù)不匹配
2.E開(kāi)頭,即E之前沒(méi)有與之匹配的F
3.循環(huán)沒(méi)有結(jié)束在同一個(gè)循環(huán)體F里面用相同的變量
然后要明確每條F語(yǔ)句需要記錄的東西:
1.變量名,因?yàn)楹竺嬉鶕?jù)它來(lái)判斷語(yǔ)法是否錯(cuò)誤
2.m值
*/
AC_code:
總結(jié)
以上是生活随笔為你收集整理的P3952 时间复杂度(模拟)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 小阳买水果(前缀和,单调栈,思维)
- 下一篇: P1650 田忌赛马(贪心)