2017年2月22日 星期三

[C_AR42-易] 過半元素

http://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?id=3042


這題由於不知有多少數列故用字串切割去比對過半數

ITSA 第50次月賽 [Problem 2] The Typhoon

http://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?id=33316


這題按照公式照打就行了~

ITSA 第50次月賽 [Problem 4] 偽造的金幣!!

http://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?id=33318


這題背後原理是Divide&Conquer演算法,可以推導出只用一行程式的公式
 (1)假設N = 8袋, 先分成3、3、2 三大袋(A、B、C),先拿A、B秤,若A、B平衡,代表C有偽幣;反之A或B裡輕的那一大袋有偽幣
(2)若A是輕的有偽幣,將A袋分成1、1、1三大袋(D、E、F),先拿D、E秤,假如天秤不穩,代表輕的那一代就是偽幣;反之,F是偽幣

從這過程中,得知不斷將問題兩半切下(Divide)去比對(Conquer),正是這演算法的精神
至於怎變成公式,跟BigO(演算法複雜度)有關係

這種方法叫做prune & search,典型的演算法就是binary search,每比對一次,就可以去除一半不可能的,留下一半可能的繼續搜尋下去。而這一題,就是希望每秤一次,不管運氣好壞,留下來的越少越好

至於為什麼要取三堆呢?
分兩堆只能砍掉一半;分四堆以上,秤其中兩堆,運氣不好,只能砍掉這兩堆,其他留著繼續秤;分三堆,運氣不管好壞,都只會留下1/3

2017年2月21日 星期二

ITSA 第53次月賽 [Problem 3] 號碼鎖最少轉動幾次

http://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?id=34243


這題就使用貪婪比較從前面轉或從後面轉比較少次
大小比對這部分我是使用問號運算式當為真執行冒號前面,反之

ITSA 第53次月賽 [Problem 2] 洞穴裡的人

http://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?id=34242


這題就用迴圈每次乘以1/4.若進入人數大於裡面剩餘人數就退出,並印出最後剩餘人數

Q256: Quirksome Squares

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=192


這題你會發現quirksome number是一個完全平方數例如81=9*9,n=4假如有四位數0~9999依序判斷肯定會TL超時
所以我們只要判斷1、4、9、16....到(10^(n/2)-1)*(10^(n/2)-1)
簡單來說當n=4時迴圈從0開始直到100結束,求0~99的完全平方來判斷是否為quirksome number

[C_AR023-易] 字根與子字串

http://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?id=2203


這題對java來說很簡單直接呼叫字串函式contains就能判別是否為子字串了

[C_AR40-易] 螺旋矩陣

http://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?id=3019

這題螺旋矩陣最直覺方法就是模擬,那如何做呢?首先不管順(逆)時鐘都有個規律,建議各位還是在紙上寫下每個位置的索引值如下:

[0,0] [0,1] [0,2] [0,3]
[1,0] [1,1] [1,2] [1,3]
[2,0] [2,1] [2,2] [2,3]
[3,0] [3,1] [3,2] [3,3]

看到這可能還是很模糊,我們在看下面這張圖搭配索引值發現他其實是有規律的,以順時鐘來說我們依序由上排佐至右,接下來又半部由上而下,然後下半部由右至左,最後左邊由下而上內層一樣按照此規律
那在這各位可能會問我們怎知道有幾層呢?把它當作洋蔥n=4時他有4/2=2層(迴圈跑兩次的意思,觀察索引值),那當遇到偶數時該怎麼辦呢?n=5,時就有5/2=2層,你可以發現他其實還有一層但他只有一個數字,可以把它當作成是圓的中心點個別處理arr[n / 2][n / 2] = count;




2017年2月20日 星期一

[C_MM86-易] 公因數問題

http://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?id=2298


這題就是做兩次最大公因數(因為有三個數字),最後出來的數再做質因數分解就是答案了!
這是最件簡單的最大公因數公式(輾轉相除法)
while((a%=b)!=0&&(b%=a)!=0);

[C_ST84-易] 差集

http://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?id=15564


差集就跟交集相反,程式碼也類似

[C_ST83-易] 聯集

http://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?a=7760


這題使用Set集合來完成聯集,至於為什麼要用Set呢?原因是它是唯一實作SortedSet介面的類別,因此可針對Set中的元素進行排序

[C_ST82-易] 交集

http://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?id=15560


這題使用ArrayList動態配置交集數,並且使用Collections.sort做排序

2017年2月17日 星期五

[C_MM353-易] 找出一串輸入數字的中位數

http://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?id=30064


這題利用Arrays.sort()做排序很快地就能找出中位數