今天和乙個參加csp複賽的家長交流了些事情,所以有感寫了這個。如果覺得不對,歡迎拍磚。
山東某家長,小朋友剛參加了 csp-j 組複賽,第二題出現 tle ,整個山東第二題 100 分只有 5 人。家長說孩子思路是正確的,能否申述。我和家長巴拉巴拉了一大堆,這些不是核心。我告訴家長,oi考試核心是演算法的複雜度,而不是思路。任何題目都有好多種解法。oi考試的核心是數學,是數學,是數學。重要的事情說三遍。我用乙個具體題目來分析問題。
hdu編號6124,
hazelfan 有兩個正整數 a,b,他想計算 a mod b。 但現在他忘了 b 的值,只記得 a 的值,請告訴他不同的可能的求餘結果的數量。
第一行包含乙個正整數 t(1 ≤ t ≤ 5),表示測試樣例數。
對於每個測試樣例: 一行,包含正整數 a(1 ≤ a ≤ 10^9)。
對於每個測試用例: 單行包含乙個非負整數,表示答案。
2
13
2
3
就是求 a % b 值的可能性。
數學的取模運算,而且是整數的取模運算。按照數學的定義,a % b 的餘數 r ,r = a - k * b,其中 k = b / a 的商。
正整數 t(1 ≤ t ≤ 5)。哪麼原題你愛怎麼寫都能 100% 通過。
哪麼我們用初學者最容易的方法,列舉遍歷唄。
#include using namespace std;
int main()
cout老鐵,沒問題,標準o(n^2)。
等一下,問題解決了?我們將題目做個修改,
題面不做任何修改,只是吧 t 的範圍擴大到10^6,也就是 1e6 的資料集。歡迎參考以下的題目鏈結,
第一行包含乙個正整數 t(1 ≤ t ≤ 10^6),表示測試樣例數。
對於每個測試樣例: 一行,包含正整數 a(1 ≤ a ≤ 10^9)。
題目沒有任何的變化,就是資料集放大,也就是 t 從 5 變成了 1e6 大小。
哪麼意味著o(n^2)複雜度的解法,必然出現 tle ,也就是說只能拿到部分分數。讓oj重新判決題目。果然結論如下圖。
也就是意味必須對原有演算法進行公升級,才能拿到 ac 。
本題的核心是數學。下面我們簡單分類討論一下,a mod b 情況:
1、如果 a ≤ b,則 a % b 有 (n + 1) / 2 種可能.;
2、如果 a ≥ b,則有 1 種可能.。
所以,總共有 (n + 1 ) / 2 + 1 種可能.。
哪麼這樣,利用數學分析,我們就將演算法從 o(n^2) 變成 o(n)。其實 ac **不是核心,但是還是貼一下吧。
#include int main()
//fclose(stdin);
//fclose(stdout);
return 0;
}
oi考試核心是演算法的複雜度,而不是思路。任何題目都有好多種解法。oi考試的核心是數學,是數學,是數學。重要的事情說三遍。
p.s.
道歉,工科男,文筆實在不咋地。大家不要介意。
OI比賽注意
這篇東西將永遠置頂到我的oi生涯結束,我也會根據實際情況而做修改,希望也能幫助到其他的oier。一 競賽過程 step1 審題 30分鐘左右 1 通讀題目 2 對問題在演算法層次思考 注意不要漏掉題目中任何條件 3 估量題目實現難度 演算法設計難度 程式設計複雜度 4 按照實現難度從小到大制定做題順...
OI比賽經驗總結
前面的都是稀里糊塗水過去的就不說了 apio2015 該犯的錯誤都犯了 賽後知道有兩小時ak的選手真是不想玩了 1.比賽策略 本來應該是30分鐘仔細看題 每題10分鐘思考 我只看完題就去打t2了 而且要命的是題目沒看清楚 t3就是那種要思考一下但很好寫的題目 我就犯了毫無經驗的新手式錯誤 先寫顯而易...
OI比賽注意事項(不定期更新)
1.該開longlong的想到就開 不然忘了能哭死你 2.雙向邊開雙倍空間 3.注意可能存在的陣列越界 主要是類似a 1 4.盡量少mod或用減法代替取模 5.自然溢位hash不可取 6.注意比賽的評測環境以區分long long的識別符是lld還是i64d 7.fft等和二的次冪有關的空間要開到2...