農夫約翰想修復牧場周圍的一小部分籬笆。他測量圍欄,並發現他需要ñ(1≤ ñ ≤20000)厚木板,每乙個都具有一些整數長度大號我(1≤ 大號我 ≤50000)單元。然後,他購買了一塊足夠長的單塊長板,足以切入n塊木板(即,其長度為長度l i的總和)。fj忽略了「鋸縫」,即鋸切時因鋸末而損失的額外長度;您也應該忽略它。
fj遺憾地意識到自己沒有切割木頭的鋸子,於是用長木板將其鑲嵌到farmer don』s farm上,禮貌地詢問他是否可以借用鋸子。
壁櫥資本家農夫唐(farmer don)不借給fj鋸,而是提議就木板中的n -1個切口向農夫約翰收費。切割一塊木頭的費用恰好等於其長度。切割一塊長度為21的木板的成本為21美分。
然後,農夫唐讓農夫約翰決定切割木板的順序和位置。幫助農夫約翰確定他可以用來製作n塊木板的最低金額。fj知道他可以按各種不同的順序切割木板,這將導致不同的費用,因為最終的中間木板長度不同。
輸入項
第1行:乙個整數n,木板數
第2行。n +1:每行包含乙個整數,描述所需木板的長度
輸出項
第1行:乙個整數:要進行n -1次削減,他必須花費的最低金額
樣本輸入3
858樣本輸出34
暗示
他想將一塊長度為21的木板切成長度分別為8、5和8
的一塊。原始木板的尺寸為8 + 5 + 8 = 21。第一次切割的成本為21,應用於將電路板切割成13和8的尺寸。第二次切割的成本為13,應用於將13切割為8和5的尺寸。這將成本21 + 13 = 34 。如果將21削減為16,將5削減,則第二次削減將花費16,總共37(超過34)。
這道題應該是乙個哈夫曼樹問題 直接上**
1.
typedef
long
long ll;
//輸入
int n,l[maxn]
;void
solve()
else
if(l[i]
//將這兩塊板合併
int t=l[mii1]
+l[mii2]
; ans+
=t;//此處還不太懂 明天問問學長
if(mii1==n-1)
swap
(mii1,mii2)
; l[mii1]
=t; l[mii2]
=l[n-1]
; n--;}
printf
("%lld\n"
,ans)
;}
上面的**複雜度是o(n^2)
然後本題可以用o(nlogn)的時間求解
#include
using
namespace std;
typedef
long
long l1;
//輸入
int n,l[maxn]
;void
solve()
//直到最大到木板為 1塊為止
while
(que.
size()
>1)
printf
("%lld\n"
,ans)
;}
時間不夠了 下次再早點開始寫
就醬紫 88!
實驗六 大雜燴
實驗六 1.實驗任務1 include include include define n 10 執行程式輸入測試時,可以把n改小一些輸入測試 typedef struct student stu void input stu,int 輸入學生資訊 void calc stu,int 計算總評和等級 ...
第六天 風氣
第六天 風氣 答 人有了,就得定規矩,否則就是一幫烏合之眾,而不是團隊。1必須朝九晚五。嚴格控制員工手裡有辦公室鑰匙。下班必須準時鎖門,員工準時離開。斷公司外網。要加班必須上級主管簽字,更不准在辦公室留宿,洗澡。這一條很重要,不要讓程式設計師活得像個浪子,精神恍惚,口中神叨,鬍子拉碴,這都是浮動工作...
開課第六天
今天是開課第六天,老師上午沒有講課,講了一上午的題,下午又講了新知識,如下 1 順序結構 從上到下順序進行。2 分支結構 if boolean表示式 else switch 值 case 值 break case 值 break switch 執行流程,switch的值和case的值一一比較,如果一...