SCP 我們讀題,思考,擺爛(CSP 注意事項)
注意事項
考試風貌
當你來到考場:
上機測試時多敲敲鍵盤,順手的鍵盤都需要敲打一番~(提前熟悉鍵盤的各個鍵——經常會與自己學校的不一樣)
根據個人需求並在合理時間內待在考場裡,熟悉一下氣氛。
別理別人。
自始而終別對拿大獎有太大執念,得之我幸失之我命。 執念過深反而是負擔。
做個素質人,堅守職業操守,和生活美德。分可以丟,但做人最基本的原則不能沒有。是啥應該不用我說(玩爛梗)。
考試ing:
檢查檔案的副檔名是否顯示,若不顯示,一定要將副檔名顯示出來。
無視旁人,做丫的題。
思考時間超過 0.5~1h 就放鬆一下,一直不停腦袋會亂的。
無論附近的人鍵盤敲多大聲,你都不要管他,實在不行心中默唸:“不是我的(指鍵盤)不是我的不是我的不是我的...”當然不想忍記得舉報哦親~
好好讀題
咱舉個例子,你們仔細觀察下面這段描述:
具體我不說了,你品,你細品~
拼了你的老命去卡你的程式碼!
這題你會,不要發出愉悅♂的聲音,不會,也不要發出愉悅的♂聲音。不要影響其他人
離開時垃圾帶走,別落下什麼東西。(之前我把飯卡落下了,結果人家託人送回來了,感動QWQ)
考完了:
別 fake。
其他
程式碼
注意 C++14 的編譯環境,vector double 等的新用法或改變
除錯
可以定義識別符號來進行本地除錯
#define DEBUG #ifdef DEBUG //do something #endif // or #ifndef DEBUG //do something #endif
#ifdef
會檢查程式中是否有通過 #define
定義的對應識別符號,如果有定義,就會執行下面的內容,#ifndef
恰恰相反,會在沒有定義相應識別符號的情況下執行後面的語句。
我們提交程式的時候,只需要將 #define DEBUG
一行註釋掉即可。
對拍
寫了份程式碼,但是不知道它對不對。
如果時間足夠,寫對拍。
原料:一份暴力(或其他非正解),一份你寫的薛定諤的正解,一份資料生成器
當然,我們不能自己比對兩段程式的輸出,所以我們需要通過批處理的方法來實現對拍的自動化。
每次執行一次資料生成器,將生成的資料寫入輸入檔案,通過重定向的方法使兩個程式讀入資料,並將輸出寫入指定檔案,利用 Windows 下的 fc
diff
命令),從而檢驗程式的正確性。
如果發現程式出錯,可以直接利用剛剛生成的資料進行除錯
模板
#include <bits/stdc++.h>
using namespace std;
signed main () {
//For Windows
//對拍時不開檔案輸入輸出
//當然,這段程式也可以改寫成批處理的形式
while (1) {
system("gen > test.in");//資料生成器將生成資料寫入輸入檔案
system("test1.exe < test.in > a.out"); //獲取程式1輸出
system("test2.exe < test.in > b.out"); //獲取程式2輸出
if(system("fc a.out b.out")) {
//該行語句比對輸入輸出
//fc返回0時表示輸出一致,否則表示有不同處
system ("pause"); //方便檢視不同處
return 0;
//該輸入資料已經存放在test.in檔案中,可以直接利用進行除錯
}
}
}
關於隨機資料生成
- 在使用
rand()
前,別忘了呼叫srand(time(NULL))
來重置隨機數種子。(不重置的話,每次呼叫rand()
只會得到一套隨機數) rand()
的生成隨機數範圍在Windows下為 \([0,32767]\) ,在Linux下為 \([0,2^{31}-1]\),所以如果資料過大,最好手寫一個隨機數生成器。
防爆
常按 Ctrl + S 是個不錯的習慣。
空間允許的情況下,記得開 long long,但不要動不動就 #define int long long
看好空間。
有了更好的思路?當前程式碼不要刪,註釋掉或重開一個檔案,說不定以後會用。
最後幾分鐘,檢視 freopen,編譯執行一遍。
凡是位運算全部加 () !!!/fn
慎重使用短路評估,位運算等價巨集
巨集 | 定義為 |
---|---|
and | && |
and_eq | &= |
bitand | & |
bitor | | |
compl | ~ |
not | ! |
not_eq | != |
or | || |
or_eq | |= |
xor | ^ |
xor_eq | ^= |
輸入輸出量大的記得寫快讀快出
template <typename T>
inline void read (T &a) {
T x = 0, f = 1;
char ch = getchar ();
while (! isdigit (ch)) {
(ch == '-') and (f = 0);
ch = getchar ();
}
while (isdigit (ch)) {
x = (x << 1) + (x << 3) + (ch ^ '0');
ch = getchar ();
}
a = f ? x : -x;
}
template <typename T, typename ...A>
inline void read (T &t, A &...a) {
read (t), read (a...);
}
template <typename T>
inline void print (T x) {
if (x < 0) putchar ('-'), x = -x;
if (x > 9) print (x / 10);
putchar (x % 10 + '0');
}
signed main () {
int a, b, c;
read (a, b, c);
}
實測自己寫 inline int abs/max/min 要比C++自帶的快一丟丟
遞迴函式不要加 inline,逆優化。