刷題筆記 CG第二週

2021-10-06 18:39:44 字數 3870 閱讀 8375

輸入n,輸出1-n的自然數中各數字只包含0和1的數的個數。資料範圍為10的9次方

常規思路一:dfs從1開始找n*10和n*10+1;

#include

int n;

int count=0;

//計數器

intbinary

(int m)

intmain()

非常規思路二:打表

10^9內共有512個二進位制型的數。

1到512轉為二進位制數

#include

const

int ans=

;int

main()

return0;

}

思路三:直接十重迴圈,生成所有可能的數,再判斷是否在區間內

#include

#include

using namespace std;

int a[

100]

,ans,n;

intpow_

(int a,

int b)

//手寫pow,避免鬼畜

intmain()

printf

("%d"

,ans)

;return0;

}

思路四:存在乙個判斷n的最近乙個二進位制數是多少,轉成十進位制就是個數了

比如13就要找到11然後轉成3

這個數由n中大於等於1的數字全變成1就完事了

小y,小w和小d進行扔骰子(六面)遊戲,誰投出的點數最大算誰勝利,現在已知小y和小w的得分,請你幫小d求出她獲勝的概率

注意:1.以"分子/分母"輸出,特別的,若不可能獲勝輸出"0/1",100%獲勝輸出"1/1"

2.小y和小w非常紳士,如果小d的得分和他們一樣,他們也會算作小d獲勝

思路:判斷小y和小w兩個值哪個大,大的那個和6比還剩下多少可以取的值,再算概率

#include

using namespace std;

int y, w;

int maxn, d;

intmain()

給你乙個浮點數,如果整數部分最後一位是9就輸出"goto vasilisa."(不含引號),否則輸出這個數(輸出時要四捨五入到整數字)

思路:字串處理

#include

using namespace std;

intmain()

else}}

}return0;

}

在乙個正方體上塗色,給出可以塗的顏色,求有多少種塗的方法,若可以通過旋轉得到的兩種情況視為同一種情況。

我們只要把每種情況的方案數算出來,直接就可以解得。

列舉出來,總共11種;

1、6——1;

2、1,5——1;

3、2,4——2;

4、3,3——2;

5、1,1,4——2;

6、1,2,3——3;

7、2,2,2——6;//考慮兩個面塗好,再塗其他面,之後的考慮方法相同

8、1,1,1,3——5;

9、1,1,2,2——8;

10、1,1,1,1,2——15;

11、1,1,1,1,1,1——30;

#include

using namespace std;

bool cmp

(int a,

int b)

intmain()

sort

(b, b +

6, cmp);if

((b[0]

==6)||

(b[0]==

5&& b[1]

==1))

printf

("1\n");

elseif(

(b[0]==

4&& b[1]

==2)||

(b[0]==

3&& b[1]

==3)||

(b[0]==

4&& b[1]

==1&& b[2]

==1))

printf

("2\n");

else

if(b[0]

==3&& b[1]

==2&& b[2]

==1)printf

("3\n");

else

if(b[0]

==2&& b[1]

==2&& b[2]

==2)printf

("6\n");

else

if(b[0]

==3&& b[1]

==1&& b[2]

==1&& b[3]

==1)printf

("5\n");

else

if(b[0]

==2&& b[1]

==2&& b[2]

==1&& b[3]

==1)printf

("8\n");

else

if(b[0]

==2&& b[1]

==1&& b[2]

==1&& b[3]

==1&& b[4]

==1)printf

("15\n");

else

if(b[0]

==1&& b[1]

==1&& b[2]

==1&& b[3]

==1&& b[4]

==1&& b[5]

==1)printf

("30\n");

return0;

}

題目要求輸出不小於n的最小整數,這個整數要求只含有4和7這兩個數字,並且4出現的次數等於7出現的次數。暴力打表(大概2分鐘),水過!

注意18題題意相同,資料範圍增大,考慮dfs。

//打表**:

#include

using namespace std;

typedef

long

long ll;

bool judge

(ll x)

if(t1 == t2)

return true;

else

return false;

}int

main()

return0;

}//ac**:

#include

using namespace std;

typedef

long

long ll;

ll n,obj=

;int

main()

return0;

}

打表,是乙個資訊學專用術語,意指對一些題目,通過打表技巧獲得乙個有序表或常量表,來執行程式某一部分,優化時間複雜度。這種演算法也可用於在對某種題目沒有最優解法時,用來得到分數的一種策略。

1)找到答案的方式

(1)通過暴力搜尋,找出對於資料的答案,適用於資料較大,題目簡單的情況;

(2)通過手算,找出每個資料的答案,適用於資料較小且題目較難的情況;

(3)在某些題目中,因為考慮到預處理出所有答案的時間複雜度可能會比依次讀入再求更優,所以就在讀入資料前

​ 進行對所有可能的詢問的答案或部分必要條件的預處理。這種方法雖然也是打表,但程式設計複雜度不亞於其他程式,而且一般是題目的正解。

2)輸出答案的方式

(1)直接在程式內打表,如果打表複雜度較大則不可用。  

(2)提前打表,然後複製放入程式。

演算法筆記刷題日誌 第二章

1.順序結構 第五題有點坑,要在r1 之後加上兩個空格,才可以ac 並且用到了兩個數學函式pow a,b 求指數運算,sqrt c 開根 2.選擇結構 沒啥講的 3.迴圈結構 第六題 格式輸出 md,一共m的字元,不夠用空格填 第七題 關於do while,while使用,最好用while,這樣可以...

LeetCode刷題筆記(二)

4.兩個排序陣列的中位數 給定兩個大小為 m 和 n 的有序陣列nums1和nums2。請找出這兩個有序陣列的中位數。要求演算法的時間複雜度為 o log m n 你可以假設nums1和nums2不同時為空。示例 1 nums1 1,3 nums2 2 中位數是 2.0示例 2 nums1 1,2 ...

leetcode刷題筆記(二)

描述 給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 pwwkew 輸出...