碎碎念——刷算法題的日子(1)

開學一週,進入了刷算法題的階段,用一週的時間完成了洛谷新手村的任務(感覺自己蒟蒻),適當進行一下總結,之後會盡量保持一週一次總結的習慣。
新手村大部分都是些基礎題,就算是賽前熱身的階段,感受一下敲代碼,有技巧和難度的題也有,但是不多,下面就說幾點自己的坑。

條件判斷的順序

第一次深刻感受到 ||&&的影響之大。在一個if判斷語句裏,如果有多個條件的話,很有必要考慮一下哪個條件在前,哪個條件在後,因爲這個行爲很有可能省去你大量的時間,就像我在做迴文質數時,一開始把判斷素數放在了前面,導致總有三個點TLE,搗鼓半天之後發現先判斷迴文數就可以AC了,瞬間。。。至於原理的話,因爲

判斷迴文數時使用的是製造迴文數然後判斷,並且最大的迴文質數是9989899(別問我爲什麼是,問就是不知道),在數據量過大時能省下時間。

在加上其他一些特殊條件,減去了一些判斷,就順利AC了。

勤用visit[]

看着是visit[],其實就是個用來判斷狀態的數組,bool或者int看你了。像在三連擊選數裏,利用一個visit[]數組記錄一個數的使用情況會讓你思路清晰很多,當然我相信這些題還有更高級的解法,只是我暫時不會,哭!

多元思維

這個多元,指的不僅僅是一題多解,還可以是一個函數的多種寫法,像是判斷素數isPrime,正常情況下你可以這麼寫:

bool isPrime(int n){
	if(n < 2){
		return false;
	}
	if(n == 2){
		return true;
	}
    for(int i = 2;i < sqrt(n)+1;i++){
        if(n%i == 0){
        	return false;
		}
    }
    return true;
}

不過當你知道題目要求的n是大於2甚至大於9時,你又可以寫成:

bool isPrime(int n){
	int i;
	int x = sqrt(n);
    for(i=3;i<=x;i++)
        if(n%i==0) return false;
    return true;
}

秉承能省就省的原則。
還有特殊情況下常用算法的修改,像在做陶陶摘蘋果時,在需要實現貪心時,我就把快速排序稍微修改了一下,根據一個數組的情況來調整另一個相關的數組(你也可以選擇用一個二維數組),代碼不常用就不貼了,總之做題一下就舒服了。

題意的理解

這個放在後面,壓軸的,因爲我覺得這是最基礎也是最重要的一點。在拿到一道題目的時候,我們首先要做的就是理解題意,只有在理解的基礎上你才能知道下一步要怎麼做,像數的計算Cantor表我剛看到的時候就一臉懵,搞不懂它要幹嘛,後來才發現是我理解錯了題目中的一些信息(偷窺了題解以後),瞬間有了思路,在幾次WA之後通過了題目;在理解題意的同時,你還要注意到題目中的一些特殊點(臨界,不限於臨界),這些點很可能就是你通過不了的點,我有幾次就是因爲0爆出了WA的點,然後根據特殊點,還可以幫你找規律,排除部分數據,實現更高效的代碼。
最後放下自己寫的代碼,大部分都比較簡單,就沒寫註釋了,有問題評論也可以 ^_^。
https://github.com/LongHongPing/AlgorithmPractice/tree/master/ccf_lg
我會繼續努力的!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章