題解果果最近新學習了歸併排序,對於歸併排序時有兩個序列ai和aj,果果將他們合併所需要的花費為ai+aj ,即兩個序列⻓度之和。果果現在能⼀次最多合併k個序列,其花費為k個序列的⻓度之 和。但是教練為了不讓果果浪費資源,讓他進⾏完歸併排序後的花費不超過c。果果為了偷懶想每次合 並的序列數盡可能少,於是果果想請你告訴他,他能完成歸併排序且總的花費⼩於c最⼩的k是多少 呢。
第⼀⾏有兩個整數 n ,c表示有n個序列,總的花費不超過c。 第⼆⾏有n個整數ai,表示要合併的n個序列,每個序列的⻓度。
輸出為⼀⾏,表示最⼩的k。
5 20
1 2 3 4 5
先合併(1,2)為3 ,再合併(3,3,4,5) 為 15。總花費為18⼩於20。
首先,如果合併次數越多,則花費就越多;反之,如果合併次數越少,則花費就越少,滿足二分的條件,而合併次數由每次合併的個數決定,所以只需要二分每次合併的個數即可。
但是,設每次合併k個,我們不可以保證最後一次k個合併後只剩下乙個數,所以不可以保證最優。
對於每次合併,我們都會留下乙個數,所以每次可以丟掉k-1個數,最後我們希望丟掉n-1個數,所以一開始我們就需要合併(n-1)%(k-1)+1個數,這樣就可以保證最後一次操作後只剩下乙個數,又因為我們需要讓值最小,所以一開始合併的數值要小,所以先排序。
#include
using
namespace std;
int a[
100005];
int n,m;
bool
cheak
(int x)
ans+
=tot;
q.push
(tot)
; tot=0;
}for
(int i=now+
2;i<=n;i++
)while
(!q.
empty()
)else
break;}
ans+
=tot;if(
!q.empty()
)}if(ans>m)
return0;
return1;
}int
main()
sort
(a+1
,a+n+1)
;int l=
2,r=n;
int ans=0;
while
(l<=r)
else
}printf
("%d"
,ans)
;return0;
}/*10 75
6 6 10 4 2 7 9 9 6 10
*/
To Heart 題解 歸併排序
題解果果最近新學習了歸併排序,對於歸併排序時有兩個序列ai和aj,果果將他們合併所需要的花費為ai aj 即兩個序列 度之和。果果現在能 次最多合併k個序列,其花費為k個序列的 度之 和。但是教練為了不讓果果浪費資源,讓他進 完歸併排序後的花費不超過c。果果為了偷懶想每次合 並的序列數盡可能少,於是...
歸併排序(2 路歸併排序)
遞迴寫法 include define maxn 100 void merge int a,int l1,int r1,int l2,int r2 將陣列a的區間 l1,r1 和區間 l2,r2 合併為乙個有序區間 else while i r1 while j r2 for int i 0 i非遞...
python歸併排序 python 歸併排序
排序思路 1.將陣列分成兩組a,b,建立臨時陣列 c,c長度 a b 2.i,j分別屬於a,b 3.若a i b j 將b j 放入c,j 否則 a i 放入c,i 4.迴圈3步驟,將a或b中剩餘的元素放入c,再將c複製到陣列中 5.遞迴3 4直到a,b序列的長度 1 歸併排序 class merg...