跳到主要內容

[Java] UVa 10025 The ? 1 ? 2 ? ... ? n = k problem

題目連結

題意:
給定一個式子

? 1 ? 2 ? ... ? n = k, 其中 ? 可以為 + 或 -
題目給 k 值,要求輸出最小的 n 使得式子成立

舉例:

k = 0, 存在最小的 n = 3 使得 1+2-3 = 0
k =12,存在 n = 7 使得 -1+2+3+4+5+6-7 = 12

解法:
觀察式子,可以知道式子是從 1 ~ n 的運算
例如: 假設 n 為 3,式子的最大發生在運算子都是 + (最小則為 - )
即 +1+2+3 = 6 (最小為 -1-2-3 = -6)

再觀察發現,改變任何運算子後的結果都跟原來的差為偶數
綜觀來看,n = 3時會有以下運算結果

+1+2+3=
-1+2+3=
+1-2+3=
-1-2+3=
-1+2-3=-2
+1-2-3=-4
-1-2-3=-6

因此,我們可以先求得最大值,判斷 k跟它是不是差偶數倍
以上面的例子,假設 k 為 0 ,可以得到(6 - 0) %2 = 0
意思是可以從 +1+2+3的式子透過改變運算元得到 k 的結果,則答案 n 可以為 3

因為題目要求符合答案最小的 n
解題思路為
如果存在 1+2+3+...+n = k,該 n 必為最小
否則 k 就是 將式子結果 扣掉偶數 得到

因此
題目給定 k,透過上圖公式得到最小候選 n (真正的 n 會大於等於該數)
並計算該 n 下的式子結果最大值(即 1+2+...+n)
再判斷該值與 k 值的差是否為偶數(前提是比k大,才能改運算元去得到k)
若否,增加 n 的值並重複判斷

舉例來說
k =12,最後答案 n = 7

先以上圖公式得到n = 4 (4.xxx取整數)
4*5/2 = 10,比 k=12 小

n = 5,5*6/2 = 15,15與k=12的差不為偶數
n = 6,6*7/2 = 21,理由同上
n = 7,7*8/2 = 28,符合結果,答案為 7

程式(Java):

留言

這個網誌中的熱門文章

【Ubuntu】Terminal 複製貼上的方法

Ctrl C + Ctrl V 能使用嗎? 有常常透過Ubuntu在指令海裡摸索的一定不陌生 在Terminal裡我們不能用Ctrl C + Ctrl V來進行複製貼上的作業 每次都不小心Ctrl C下去,就要抱頭痛哭QQ (在Terminal裡面是呼叫一個外部中斷,強制中止當下系統的動作) 其實在Terminal當中也有複製貼上的功能 Ctrl + Shift + C 複製 Ctrl + Shift + V 貼上 功能相當於一般的複製貼上,也只是多按一個Shift,相信不是太難適應 如果是透過VirtualBox建立的Ubuntu 想要跟主機互通的話,可以參考這篇: [VirtualBox] 共用剪貼簿與檔案 另外,在Terminal裡也有所謂的暫存剪貼簿,是針對指令設計的 Ctrl + U 剪下游標前的字元到剪貼簿 Ctrl + K 剪下游標後的字元到剪貼簿 Ctrl + Y 貼上 所謂的游標就是打指令的那行閃爍的位置 所以其他畫面上系統輸出的文字不會受影響,才說是針對指令設計 這個暫存的剪貼簿也跟一般的是分開的,或許會有派上用場的一天吧!

【Ubuntu】關閉預設畫面自動鎖定

近期一直碰到一個小麻煩 在Ubuntu VM做研究時 因為平常會在本機Search,才去VM操作 卻發現每次畫面跳去Ubuntu那邊 都還要重新打密碼登入,很惱人 怒查之下,原來這個動作叫  畫面鎖定 反正VM就是個測試環境,根本不需要這些安全措施 透過下面步驟就可以取消了 甚至連開機登入時都可以不用打密碼了呵呵

[Java] HashMap資料結構簡介與用法

Java HashMap 官方文件: https://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html import java.util.HashMap; 簡介: 以每個獨立的 key 對應一個 value 特性: 資料(K, V)原則上是一對一 key不能重複,若重複宣告,後者會取代前者 資料不會排序,預設是先宣告的在前面(呼叫整個 HashMap 的話) 用途: 建立對應表(轉換表),一 key 對一 value 像是學生成績表,以名字做為 key,查詢 key 可以得對應的成績 value 資料格式: HashMap<K,V> K: key V: value 用法: 1. 宣告 : 型別是 reference,不能存基本型別,像整數要寫 Integer 而非 int HashMap<String, String> hashmap = new HashMap<String, String>(); HashMap<String, String> hashmap = new HashMap<>(); HashMap<String, Integer> hashmap = new HashMap<>(); 2.新增資料 : 同時給Key-Value參數,新增這筆資料到該hashMap hashmap.put("Item 1", "Value 1"); hashmap.put("Item 1", 25); 3.刪除資料 : 根據參數Key刪掉對應的Key-Value資料 hashmap.remove("Item 1"); 4.取特定key對應的值 hashmap.get("Item 1"); 5.顯示整個HashMap內容 System.out.println("內容:" + hashmap); for(String Key: map.keySet()){ System.out.println(Key + " &