日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

分香肠

發(fā)布時間:2025/4/5 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分香肠 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

分香腸

Problem Description

有一根長長的美味香腸,為了給集訓(xùn)隊(duì)的小朋友補(bǔ)充能量,現(xiàn)在要把這根香腸分為K份,每一份對應(yīng)的長度為L1,L2,…,Lk。

然而香腸很硬,老周在切香腸的時候需要耗費(fèi)一定的體力,消耗的體力數(shù)值等于香腸被切割后的長度之和。

舉個"栗子":比如需要把香腸切成5; 8; 8三種長度時,老周先把香腸切成8和13,消耗體力8+13 = 21;再將13切割成5和8,消耗體力5 + 8 = 13,所以總的消耗體力數(shù)值等于21 + 13 = 34。

請你把老周計(jì)算一下,怎么樣切割香腸,才能保證消耗的體力最小。

Input

輸入第一行包含一個正整數(shù)n(1 <= n <= 20000)

輸入第二行包含n個正整數(shù)L1…Ln(1 <= Li <= 50000)

Output

輸出最小的消耗體力數(shù)值

Sample Input:

2

2 6

Sample Output:
8

分析:
不是簡單的前綴和,因?yàn)橛袞|西重復(fù)使用了。
下面代碼是錯誤的

#include<iostream> #include<algorithm> using namespace std;typedef long long ll; ll n,a[20001],sum[20001]; int main(){cin>>n;for(ll i=0;i<n;i++){cin>>a[i];}sort(a,a+n);//從小到大排序 sum[0]=a[0];for(ll i=1;i<n;i++){sum[i]=sum[i-1]+a[i];//前綴和 }cout<<sum[n-1];return 0; }

正確代碼
分析:需要取出a和b之后,把a(bǔ)和b的和放進(jìn)去,再進(jìn)行累加。
舉個例子
想要分成5,8,8三段。第一次切成8+13(消耗體力21),第二次把13分成5+8(消耗體力13),總消耗21+13=34點(diǎn)體力,這個過程中13(5+8)被用了兩次。

這個可以使用優(yōu)先隊(duì)列來做,
AC代碼

#include<iostream> #include<algorithm> #include<queue> using namespace std;typedef long long ll; const int maxn=2e4+10; ll n,num; priority_queue<ll,vector<ll>,greater<ll> > que;//從小到大排序,使用greater方法 int main(){cin>>n;for(ll i=0;i<n;i++){cin>>num;que.push(num);//自動排序 }ll low,up,sum=0;while(que.size()>1){low=que.top();//取出最小的que.pop();up=que.top();//取出次小的que.pop();sum+=low+up;//que.push(low+up);//累加之后再放入 }cout<<sum;return 0; }

總結(jié)

以上是生活随笔為你收集整理的分香肠的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。