Prob_Solve 板


LINE

※ 引述《Pttgambler ( )》之銘言: : 最近在 Leetcode 上面看到有人分享的一題線上測驗, : 想了一段時間都沒有想出暴力解以外的做法,所以來這裡問看看。 : https://leetcode.com/discuss/interview-question/4902893/recent-goldman-sachs-oa-questionanybody-with-a-optimal-approach : In a tranquil village school, there are two students named Ramu and Sonu, : each possessing a collection of N distinct chalks. Each student's chalks are : of different lengths, represented by N positive integers. Ramu has arranged : his collection of N chalks in a specific order based on their lengths. Sonu : is eager to organize his own N chalks in a way that mimics Ramu's arrangement : in terms of length changes i.e. if in Ramu's arrangement the kth chalk is : bigger than the k+1th chalk, in Sonu's arrangement also the kth chalk will be : bigger than the k-1th chalk; alternately if it is smaller in Ramu's : arrangement, then it will be smaller in Sonu's as well.Sonu was busy : arranging his chalks, when his teacher told him to also maximize the overall : "niceness" of his arrangement. Here, niceness' is defined as the sum of the : absolute length differences between all adjacent chalks in the : arrangement.Write a program to assist Sonu in achieving both the objectives: : first, to mimic Ramu's length variation order, and second, to maximize the : overall niceness of the arrangement. : Sample Input1: : 4 : 5 7 4 9 : 1 2 3 4 : Sample Output1: : 7 : Explanation1: : Given N=4. : Ramu's chalks are arranged in the order of their length as 5 7 4 9, which : corresponds to an increase- decrease-increase pattern of arrangement. Sonu : has the chalk collection 12:34. : To mimic Ramu's chalk arrangement order of increase-decrease-increase, Sonu : can arrange his chalk in the following five ways. : (1,3,2,4)-niceness-> |1-3|+|3-2|+|2-4|=2+1+2=5 : (1,4,2,3)-niceness-> |1-4|+|4-2|+|2-3|=3+2+1=6 : (2,3,1,4)-niceness-> |2-3|+|3-1|+|1-4|=1+2+3=6 : (2,4,1,3)-niceness-> |2-4|+|4-1|+|1-3|=2+3+2=7 : (3,4,1,2)-niceness-> |3-4|+|4-1|+|1-2|=1+3+1-5 : As can be seen, the maximum niceness possible is 7, which is printed as : output. 令兩個輸入為數列 a[] 和 b[] 令最佳的 b[] 順序為 B[] // sorted(b) == sorted(B) // answer == niceness(B) niceness(B) 是陣列中相鄰兩個數的差,對每個 B[i] ,有三個 case: 1. B[i] is a local maximum: 計算 niceness 時,會算到 (B[i] - B[i + 1]) + (B[i] - B[i - 1]) 只考慮 B[i] 的貢獻的話,就是 2*B[i] 或是 B[i] (B[i-1], B[i+1] 可能不存在) 2. B[i] is a local minimum: 和前一個狀況對稱,B[i] 的貢獻是 -2*B[i] 或是 -B[i] 3. 其他 - B[i-1], B[i+1] 一定都存在 - B[i-1] < B[i] < B[i+1] 或 B[i+1] < B[i] < B[i-1] 洽有一個成立 計算 niceness 時,會算到 (B[i] - B[i-1]) + (B[i+1] - B[i]) 或是 (B[i] - B[i+1]) + (B[i-1] - B[i]) ==> B[i] 對 niceness 沒有貢獻 我們先用 a 找到 local maximum 的位置 M[] 和 local minimum 的位置 m[] 假設我們已經找到排列 B ,則: def niceness(B: int[], M: int[], m: int[]): val = 0 for i in M: if i == 0 or i + 1 == len(B): val += B[i] else: val += 2*B[i] for i in m: if i == 0 or i + 1 == len(B): val -= B[i] else: val -= 2 * B[i] return val B[i] 只有五種可能的貢獻方式: 1) 2 * B[i] 2) B[i] 3) 0 4) -B[i] 5) -2*B[i] 我們將 b 由大排到小,依序用 (1), (2), (3), (4), (5) 的方式貢獻 這樣算出來的 niceness 就會是最大值 def cmp(x, y): if x < y: return -1 if x > y: return 1 raise ValueError('There are duplicated values') def solve(n, a, b): c = [0] * n for i in range(n): if i > 0: c[i] += cmp(a[i], a[i-1]) if i + 1 < n: c[i] += cmp(a[i], a[i+1]) b = sorted(b) c = sorted(c) return sum(b[i] * c[i] for i in range(n)) 證明這樣的 B 是存在的: 我們先把 b 照大小排列,依照 (1), (2), (3), (4), (5) 分組 (1) b[0] > b[1] > b[2] > b[3] > ... (2) b[k] // 也可能不存在,也可能有兩個數 (3) b[k+1], b[k+2], ..., b[l-1] (4) b[l] // 也可能不存在,也可能有兩個數 (5) b[l+1] > b[l+2] > ... > b[n-1] 這樣一定可以滿足:(1), (2) 的任意值 > (3) 的任意值 > (4),(5) 的任意值 b[k], b[l] 會被放在 b[0] 或 b[n-1] 的位置 而其他位置的極值可以分別從 (1) 和 (5) 任選 在 a[] 中,極大值和極小值一定是依序出現的, 極大值跟極小值中間可以間隔數個中間值, 我們可以從 (3) 裡面依序挑出足夠的數量,並用正確的順序放入就可以了 用這種方式構造出來的 B 一定可以滿足條件 (i) B[i], B[i+1] 的相對大小和 a[i], a[i+1] 一樣 (ii) B 的 niceness 是最大值 我把討論串裡面的幾組測資打進去答案都一樣,希望沒有漏掉什麼 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 104.133.122.86 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Prob_Solve/M.1711712753.A.A71.html
1F:推 Pttgambler: 哇!感覺就是這樣了,怎麼想出來的啊 03/29 22:13
2F:→ Pttgambler: 謝謝 03/29 22:14
3F:→ stimim: 先觀察到非極值的數字是沒有影響的,再考慮極值的關係 04/01 10:42
4F:→ stimim: 一開始的猜想是如果在極值的部分照大小排列行不行 04/01 10:42
5F:→ stimim: 然後發現兩邊的端點需要特別處理 04/01 10:43







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Tech_Job站內搜尋

TOP