1. 程式人生 > 其它 >SCP 我們讀題,思考,擺爛(CSP 注意事項)

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

命令比對檔案(Linux 下為 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檔案中,可以直接利用進行除錯
        }
    }
}

關於隨機資料生成

  1. 在使用 rand() 前,別忘了呼叫 srand(time(NULL)) 來重置隨機數種子。(不重置的話,每次呼叫 rand() 只會得到一套隨機數)
  2. 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,逆優化。