u009 瑞瑞的木板

2022-09-14 18:27:09 字數 1262 閱讀 4529

time limit: 1 second

memory limit: 128 mb

瑞瑞想要親自修覆在他的乙個小牧場周圍的圍欄。他測量柵欄並發現他需要n(1≤n≤20,000)根木板,每根的長度為整數li(1≤li≤50,000)。於是,他神奇地買了一根足夠長的木板,長度為所需的n根木板的長度的總和,他決定將這根木板切成所需的n根木板。(瑞瑞在切割木板時不會產生木屑,不需考慮切割時損耗的長度) 瑞瑞切割木板時使用的是一種特殊的方式,這種方式在將一根長度為x的模板切為兩根時,需要消耗x個單位的能量。瑞瑞擁有無盡的能量,但現在提倡節約能量,所以作為榜樣,他決定盡可能節約能量。顯然,總共需要切割n-1次,問題是,每次應該怎麼切呢?請程式設計計算最少需要消耗的能量總和。

第一行: 整數n,表示所需木板的數量 第2到n+1行: 每行為乙個整數,表示一塊木板的長度

乙個整數,表示最少需要消耗的能量總和

385

8

34
將長度為21的木板,第一次切割為長度為8和長度為13的,消耗21個單位的能量,第二次將長度為13的木板切割為長度為5和8的,消耗13個單位的能量,共消耗34個單位的能量,是消耗能量最小的方案。
【題解】

這題需要反過來想。

把一塊長木板分成n個小木板,它的逆過程。就是

把n塊小木板拼成1塊長木板。

然後本來是每次消耗所需要切割的長度的體力。

現在變成消耗掉兩塊木板拼起來的長度等價的體力。

然後依然是操作n-1次。

則。每次只要選擇最短和次短的兩塊木板拼起來就可以了。這樣可以保證每次進行的操作都是花費最小的。

而維護最小值。需要用到堆(小根堆)。

【**】

#include __int64 dui[20001] = ;//記錄堆的資訊。小根堆。

int n,pos;

void up_adjust(int p)//從位置p開始往上調整堆。

else//不需要調整了就結束。

break;

} dui[i] = x;

pos = i;//記錄下新的位置。方便繼續嘗試往下調整。

}void down_adjust(int p)//從位置p開始往下調整

else

break;

} dui[i] = x;//把這個元素放到新的位置。

}void input_data()

}void get_ans()

printf("%i64d\n", ans);

}int main()

u009 瑞瑞的木板

time limit 1 second memory limit 128 mb 瑞瑞想要親自修覆在他的乙個小牧場周圍的圍欄。他測量柵欄並發現他需要n 1 n 20,000 根木板,每根的長度為整數li 1 li 50,000 於是,他神奇地買了一根足夠長的木板,長度為所需的n根木板的長度的總和,他決...

洛谷1334 瑞瑞的木板

瑞瑞想要親自修覆在他的乙個小牧場周圍的圍欄。他測量柵欄並發現他需要n 1 n 20,000 根木板,每根的長度為整數li 1 li 50,000 於是,他神奇地買了一根足夠長的木板,長度為所需的n根木板的長度的總和,他決定將這根木板切成所需的n根木板。瑞瑞在切割木板時不會產生木屑,不需考慮切割時損耗...

題解 P1334 瑞瑞的木板

首先,這個題解是我有了慘痛的教訓 全部wa.先發乙個code做宣告 include 萬能標頭檔案,優先佇列oi請用 define lli long long int using namespace std priority queue,greater cz void work for lli i 1...