20180209-Uva406

#心得 #Prime_Cuts #Uva406 #解題

其實在寫這題的時候一開始寫出來的東西會TLE,

後來改一改又變成RA,我就丟到瘋狂程設,

原來是到超大數會錯,我就把建表的範圍在加大,就AC了

這題應該就是要先建表,

然後再找他的上界跟下界在哪裡~依照題目印出來就好

不過我覺得我寫得有點不是很精簡,

可能看之後有沒有想法再改吧~

有人有想法也可以討論~

https://i.imgur.com/Cc8vnQG.jpg

https://i.imgur.com/Hq0EwMR.jpg

Ref

20180206-Uva10162

#心得 #Last_Digit #Uva10162 #解題

這題我覺得有點麻煩,因為數字超級大( N (1 ≤ n ≤ 2 ∗ 10^100) ),所以一定要用字串(因為long long int 只到0 到 18,446,744,073,709,551,615),然後再觀察n^n最後一位的規律及序列S的規律,然後再查表,我寫了兩個查表,一個是n^n一個是 Σ(i^i)的

好久沒碰到二項式定理了,好像之前有聽過 哈哈

註:

Σ(i^i)那張表 是每20個他的數值會多4,所以其實是100個一循環,但方便寫其實寫20個再去用差補就好了~

但我覺得找規律好賭運氣,

或許這題是要靠數學吧(笑

整數儲存範圍:https://msdn.microsoft.com/zh-tw/library/s3f49ktz.aspx

找規律解法參考:http://diadoacm.blogspot.tw/…/02/acm-10162-last-digit.html

數學證明參考解法:http://blog.csdn.net/mobius_strip/article/details/37757287

不過或許會有更簡單的解法?

https://i.imgur.com/Pz1ke2h.jpg

https://i.imgur.com/XdoZWiM.jpg

https://i.imgur.com/x8MyNrI.jpg

Ref

20180205-Uva10405

#心得 #Longest_Common_Subsequence #LCS #DP #Uva10405 #解題

心得:

這題其實看懂題目+用陣列來填真的蠻簡單,但是我debug了一天,因為我圖表陣列的型別弄錯QQ 要注意這個陣列是int

題目:找最長的共同子集合

分析:

先了解甚麼是共同子集合

{ a,b,c,d} 來說

{ b, c } 是他的子集合

{ c, b } 就不是

假設兩個序列 c1,c2

假設c1中存在一個a

你就是要去c2中找有沒有a,

找到了之後再找c1中的下一個字母

而DP其實就是

  • 把大問題切成很多很多重複的小問題

  • 也可以用特定計算(遞迴)求出來

  • 把算過的答案計算下來

以這題來講,

我們用lcs[i+1][j+1]來記下算過的答案。

我們最後的答案會在lcs[m][n],因為此時我們已經掃完c1與c2的所有元素

每當我在c2裡找到原本c1的下一個子元素,

我就會把值+1,來代表他的子元素的長度。

如果我還沒有在c2中找到c1中我要找的元素,就把我之前找到的和我之前記下來的答案取最大值(max),這個步驟我覺得其實講成白話文就是記下我之前找到的最長子集合長度

為甚麼我填值是從lcs[i+1][j+1]是因為我要讓 第i行 與 第j列保持都是0,這樣讓我在找max的時候會比較好算

這題要畫圖比較好理解

https://i.imgur.com/UpCF9YB.jpg

https://i.imgur.com/xIdrQYE.jpg

https://i.imgur.com/Ikv3KVz.jpg

Ref

20180131-Uva11917

#心得 #解題 #討論 #Uva11917 #Do_Your_Own_Homework

上次問完老師之後,

今天在自己從寫一遍,

不過我是用一個struct來整理科目和天數~

我今天在營隊,

我的室友好像說也可以用map這個function來處理?

好像是類似python的字典型別的功能?

有時間研究看看~

我覺得後來看了一下,我的變數命名有待加強~哈哈

https://i.imgur.com/CeuMFru.jpg

Ref

20180128-Uva10931

#心得 #Uva10931 #Parity #解題 #討論

一開始解這題的時候,

因為輸入數字可能會很大,

而且後來發現itoa函式也不能用,

因為有些compiler看不懂。

於是我發現有其他人用遞迴的方法(只不過他寫得有點怪?,

於是我就用遞迴法想了一次,

改成我覺得可以的程式。

寫完覺得,我怎麼寫了個這麼難懂的程式碼。

我後來想想,

阿原來還可以位元運算哈哈😂

———-我是分隔線———-

先講一開始為甚麼要用遞迴法:

因為我們要把十進位轉二進位時,其實就是一直除2找餘數。

但數字是從後面寫回去,

遞迴剛好可以讓我可以不用去處理反過來的問題,

只不過想的時候會有點難想,

但比原本想的另一個方法(準備超大陣列然後反轉)還要好,

但我覺得這題用位元運算會比較好,

比較稍微難的地方是要把前面的0給去掉。

比如

0100

要變成

100 https://i.imgur.com/4znH5xg.jpg https://i.imgur.com/nnYXphZ.jpg

Ref

20180124-Gets-Puts

#心得 #緩衝區溢位 #gets_puts #string

語法:

char *gets(char *string);

int puts(const char *string);

——–我是分隔線——–

其實puts(string),就是fputs(string, stdout)更簡潔的語法。

但是fgets(string, 128, stdin),不等於gets,因為gets沒有參數可以限制讀進string的字元數,因此在現在的compiler會建議不要使用gets函式,因為可能會發生buffer overrun(緩衝區溢位)的問題。

另外,C語言中也有一些標準函式庫裡函式的使用也需要特別注意,如:gets, scanf, strtok, strcpy。

然後後來我找到一篇講解概念的:

https://medium.com/…/%E7%B7%A9%E8%A1%9D%E5%8D%80%E6%BA…

https://zh.wikipedia.org/…/C%E6%A8%99%E6%BA%96%E5%87%BD…

Ref

0%