題意:
簡單易懂,就是小明判斷了乙個程式的複雜度,然後讓你求一下,如果這個程式不合法就輸出「err」,如果和小明判斷的一樣,「yes」,否則就是"no".
題意:
一開始我也不清楚這個題怎麼模擬,因為有很多細節,也很棘手,自己寫可能需要好幾個小時,而且可能還不對,於是看了一下別人是怎麼寫的,不看不知道原來模擬題,主要不是看別人怎麼模擬的,而是看出了別人對題目的理解上,只要理解透徹了,寫起來多簡單易懂都可以。
注意細節:
必定err
1、f,e個數不匹配
2、變數重定義
然後用f,e好比左右括號,暗示我們用棧模擬。
f的時候:進行判斷合法:
1、如果 a>b不合法
2、如果 上一層不合法
e的時候:進行更新操作
貼上**:
#includeusing namespace std;
const int n=255;
const int inf=100000;
int vis[n]; //標記字母是否出現過
int dep[n]; //深度=複雜度
int judge[n]; //判斷當前深度是否合法
int n,tc,c; //n個指令,tc實際最大複雜度,c是小明判斷的複雜度
int flag,top; //flag指的是:出錯標記位,top棧頂指標
int a,b; //for ( i a b ) 起始值 終止值
char st[n]; //用棧存字母
char a[n],b[n]; //用字元陣列處理輸入
char i[5],ch[5]; //迴圈變數 i,ch存指令
void solve(){
scanf("%d%s",&n,a);
tc=c=0;
for(int i=4;a[i]!=')'&&a[i];i++)
c=c*10+a[i]-'0';
flag=0,top=1;
memset(judge,0,sizeof(judge));
memset(vis,0,sizeof(vis));
memset(dep,0,sizeof(dep));
memset(st,0,sizeof(st));
while(n--){
scanf("%s",ch);
if(ch[0]=='f'){
scanf("%s%s%s",i,a,b);
if(vis[i[0]]) flag=1;
st[++top]=i[0];
vis[i[0]]=1;
a=b=0;
if( a[0]=='n' ) a=inf; // 控制for 起始值
else for(int i=0;a[i];i++) a=a*10+a[i]-'0';
if( b[0]=='n' ) b=inf; // 控制for 終止值
else for(int i=0;b[i];i++) b=b*10+b[i]-'0';
if( a>b || judge[top-1] ) judge[top]=1;
if( a
洛谷P3952 時間複雜度 模擬
題目鏈結 咕了一年的題解。就是個模擬吧 考場上寫的遞迴也是醉了。感覺一年自己進步了不少啊。面向資料程式設計的能力提高了不少 include define fi first define se second define mp make pair using namespace std const i...
洛谷 P3952 時間複雜度 模擬
這個模擬,注意每次進入迴圈的時候把新狀態全部入棧,退出迴圈的時候就退棧。第一次就錯在發現err退出太及時,把剩餘的資訊留在流裡面。includeusing namespace std typedef long long ll void solve 變數進棧的順序 stackchs 被占用的變數的標記...
洛谷P3952 時間複雜度
題目描述 小明正在學習一種新的程式語言 a 剛學會迴圈語句的他激動地寫了好多程式並 給出了他自己算出的時間複雜度,可他的程式設計老師實在不想乙個乙個檢查小明的程式,於是你的機會來啦!下面請你編寫程式來判斷小明對他的每個程式給出的時間複雜度是否正確。a 語言的迴圈結構如下 f i x y 迴圈體e其中...