跳到主要內容

發表文章

目前顯示的是 1月, 2020的文章

[Training] UVA 1595 Symmetry

本題為 Brute Force 可以迅速解題。 題目給予一些二維座標,求是否所有點左右對稱。 看似簡單,但需要注意以下幾點,不然很容易拖掉 Debug 時間。 1.   scanf 讀取輸入的時候,遇到自定義的 struct,不必遲疑,直接把 “&” 寫在前面:           scanf("%d %d", &a[i].x, &a[i].y); 2.   取 x 最大值和最小值,相加當作中點,不需要除以 2,避免出現浮點數問題。 3.   x_min 和 x_max 取完,要馬上回歸初始值。x_min 初始值要是很大的值,x_max 初始值是很小的值。 4.   要考慮座標有可能落在對稱線上,for 迴圈掃過所有點,某一點自己也可以跟自己取中點來做判斷。 完整程式碼: // This code is created by EdocZec on 2020/01/25 #include <bits/stdc++.h> #define _for(i,a,b) for(int i=(a); i<(b); ++i) // this has been verified and can work correctly. #define _dbg(arr,n) _for(i,0,n){cout << " [Debug] arr[" << i << "] = " << (arr)[i] << endl;} // this has been verified and can work correctly. using namespace std; struct point { int x; int y; }; point a[4000]; int main(int argc, char** argv) { int case_num; scanf("%d", &case_num); _for(i,0,case_num) ...

[Linux] Elementary OS 安裝

本篇記錄 Elementary OS 的安裝過程。 1.   先去網站上下載 Elementary OS 的映像檔: 網址: https://elementary.io/ 點選要捐贈給 Elementary OS 團隊的費用,也可以是 0 元。然後下載映像檔。 2.   接著開始燒錄 USB: 先準備一個 USB 隨身碟,然後將 Elementary OS 的映像檔燒錄到這個 USB 隨身碟內,製作成開機 USB 磁碟。 我使用 UNetbootin 來燒錄 USB,UNetbootin 下載網址: https://unetbootin.github.io/ 啟動 UNetbootin,選擇映像檔的選項,檔案的類別選擇 ISO,然後選擇 Elementary OS 映像檔路徑: 按下 [確定] 按鈕,開始燒錄: 燒錄完成畫面: 按下 [結束] 按鈕離開 UNetbootin,並退出隨身碟,完成 USB 開機磁碟的製作。 有時候,燒錄完成的 USB 會出現無法開機的情況,此時可嘗試用其它的燒錄軟體,例如 Etcher 或者 Rufus 。 3.   接著用剛燒錄完成的 USB 開機。首先在電腦開機時,按住 Delete 鍵進入 BIOS 設定畫面,將開機磁碟設定為 USB 開機。 4.   依造 官方的說明 安裝即可。在安裝之前,先把磁碟的資料備份,然後安裝 elementary os 時選擇格式化所有磁碟內的資料,就可以了。 安裝完的開機畫面:

[開箱] 寫 code 專用螢幕 Samsung UHD Monitor 32 吋

過年買了 Samsung UHD 32 吋寬螢幕,用來寫程式以及編輯影片,今天來開箱吧。 外箱設計的部分,簡約乾淨地把產品特色標註在包裝上。 內層有保麗龍保護防震。 面板邊框不會太寬整體看起來很和諧,質感不錯。 附贈的配件也很簡單,一條 HDMI 的線,電源供應器,支架和說明書。 將支架與螢幕組裝起來,不需要螺絲起子,用手就可以旋緊大板的螺絲。 接上電腦後,相較於往常許多的螢幕有許多按鍵,這個螢幕的按鈕設計十分簡約,只有一個按鈕,設置在螢幕背部。這讓我想到賈伯斯當 2007 年發表 iphone 第一代時說的話: “get rid of these buttons, buttons and controls can't change.” 設置完畢: 設定抗藍光(長期寫 code 容易盯著螢幕),跟調整亮度: 心得: 三星螢幕的品質一直都算蠻領先的。在 UI 以及外觀上,最近幾年都有往簡約的方向改良。我覺得不論設計什麼產品,簡約這個觀念,在使用者的印象跟舒適度上,是很加分,也很重要的一種風格。

[Training] GCJ 2015 Round 2 Kiddie Pool

Kiddie Pool 問題簡化如下: n 個水龍頭 1...n,每個水龍頭出水速度 Ri,各自水溫為 Ci 。今要混合成溫度 X 且體積 V 的水,求最小時間? 題目給的溫度公式,跟質心公式一樣。所以目標溫度 X,可以平移到數線 0 的位置。也就是每個水龍頭溫度都改為 X-Ci,目標改為配出溫度 0 度的水,方便計算。 考慮某個水龍頭開的時間最久,開啟時間為 t 秒,則得知其他的水龍頭最多也只能開啟 t 秒,不能再多。現在的目標為 t 需最小。 因此本題化簡為:假設最終答案就是 t 秒,每個水龍頭假設都先開啟 t 秒,各自裝入各自的水杯,然後計算有哪些水杯內的水是多餘的,需要倒掉。倒掉後的每杯水體積總和要逼近目標的體積 V,總和超過或小於 V,就要調整 t 的大小,直到體積總和等於 V 為止。 解上述第 3 點的問題,可以想像成有一蹺蹺板,上面放著 n 杯水。每杯水重量為 Ri × t。每杯水跟支點距離 abs(X-Ci)。為了維持平衡,必須將多餘的水從某幾杯中倒出,微調到蹺蹺板平衡時,所有水杯總重量總和需逼近 V。 利用貪婪演算法,從靠近支點處往遠離支點處走訪每個水杯,並累計力矩的值,左右兩邊一定會至少有一邊走訪到盡頭,此時若有一邊的力矩比較多,將力矩多的那邊當前走訪到的水杯,透過倒掉水的方式使左右平衡。 調整到支點左右力矩相等時,檢查水的體積總和是否符合要求,如果總體積太小,就拉高 t 值,否則降低 t 值。t 值的逼近,用 Binary Search 逼近法。 本題要十分注意的地方是 IMPOSSIBLE 的判斷。如果蹺蹺板支點沒有任何物品,且支點左邊全空或右邊全空,就是 IMPOSSIBLE 的情況。如果支點有物品,或者支點左右都有物品,此時 t 已經快要趨近極大,就代表 IMPOSSIBLE。 核心程式碼如下: 其中 left/right 代表支點左右的力矩,v_max 為當前 t 值下,力矩平衡的最大體積,center 是用來判斷支點有沒有物品。binary search 的 iteration 共 1000 次。 // binary search double low = 0, high = 1e20; for(int it = 0; it < 1000;...