傳送門
這道題我去年做到**,最後還是爆零了,現在我還是特別慢才寫完……
唯一不同就是現在思路比較清晰,但是我的做法比較複雜,**很長。
我們要處理以下事情:
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...