日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

P3952 时间复杂度(模拟)

發(fā)布時(shí)間:2024/9/3 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P3952 时间复杂度(模拟) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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ù)制

8 2 O(1) F i 1 1 E 2 O(n^1) F x 1 n E 1 O(1) F x 1 n 4 O(n^2) F x 5 n F y 10 n E E 4 O(n^2) F x 9 n E F y 2 n E 4 O(n^1) F x 9 n F y n 4 E E 4 O(1) F y n 4 F x 9 n E E 4 O(n^2) F x 1 n F x 1 10 E E

輸出 #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:

#include <bits/stdc++.h> #include <sstream> using namespace std; typedef pair<string,int>pr; const int MAXN = 105; pr st[MAXN]; int t; int getNum(string s)//字符串中提取數(shù)字 {stringstream sst(s);int num;sst>>num;return num; } int getTime(string s) //得到給的復(fù)雜度,即m值 {if(s == "O(1)") return 0;int pos = s.find('^');s = s.substr(pos+1);return getNum(s); } bool isExit(string s)//判斷前面沒(méi)有結(jié)束的F中是否存在變量s {for(int i = 1; i <= t; i++){if(s == st[i].first)return true;}return false; } int getNowTime(string s1,string s2)//處理F語(yǔ)句的復(fù)雜度,返回m值,F語(yǔ)句沒(méi)有執(zhí)行返回-1 {if(s1=="n"){if(s2=="n") return 0;else return -1;}else{if(s2=="n") return 1;else{int x = getNum(s1);int y = getNum(s2);if(x > y) return -1;}}return 0; } int main() {ios::sync_with_stdio(false);int T;cin>>T;while(T--){int n;string s;cin>>n>>s;int time = getTime(s);bool error = false;int maxTime = 0;t = 0;/*way1:cin.clear();cin.sync();*/cin.get(); //way2//cin.ignore(); //way3for(int i = 0; i < n; i++){string line;getline(cin,line);if(error) continue;string a[5];stringstream sst(line);int k = 0;while(sst>>a[++k]) {}if(isExit(a[2])){error = true;continue;}int nowTime = getNowTime(a[3],a[4]);if(t == 0)//棧為空時(shí){if(a[1]=="F")st[++t] = make_pair(a[2],nowTime);elseerror = true;}else{if(a[1]=="E")//出棧,匹配掉一個(gè)F{--t;continue;}else{int tmp = -1;//只有當(dāng)前棧頂m值有效并且當(dāng)前獲得的m值有效才可累加(m!=-1)if(st[t].second>=0&&nowTime>=0)//累計(jì)m值tmp = st[t].second+nowTime;st[++t] = make_pair(a[2],tmp);}}maxTime = max(maxTime,st[t].second);//記錄最大值}if(error||t) cout<<"ERR"<<endl;else if(maxTime == time) cout<<"Yes"<<endl;else cout<<"No"<<endl;}return 0; }

總結(jié)

以上是生活随笔為你收集整理的P3952 时间复杂度(模拟)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。