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行: 每行為乙個整數,表示一塊木板的長度
乙個整數,表示最少需要消耗的能量總和
3858
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...