裝果子(二分答案)

2021-08-02 17:24:00 字數 1592 閱讀 7822

果園裡有n顆果樹,每棵果樹都有乙個編號i(1≤i≤n)。小明已經把每棵果樹上的果子都摘下來堆在了這棵樹的下方,每棵樹下方的果子體積為ai。

現在小明將拿來m個袋子把這些果子都裝進袋子裡。每個袋子的體積為v。小明會按照如下規則把果子裝進袋子裡:

(a)從第1棵果樹開始裝起,由1到n一直裝到第n棵果樹。

(b)如果這棵果樹下的果子能全部裝進當前這個袋子,就裝進去;如果不能,就關上當前這個袋子,開啟乙個新的袋子開始裝。

小明希望在能把所有果子都裝進袋子裡的前提下,v盡量小。m個袋子並不一定都要裝進果子。

輸入檔名為fruit.in

輸入第1行,包含兩個整數n和m。

第2行,包含n個整數ai。

輸出檔名為fruit.out

輸出僅1行,表示最小的v。

fruit.in
3 3
1 2 3
fruit.out
3
fruit.in
5 3
1 3 6 1 7
fruit.out
7
fruit.in
6 3
1 2 1 3 1 4
fruit.out
4

【輸入輸出樣例解釋1】每個袋子的體積為3即可。前2棵果樹的果子裝在第乙個袋子裡,第3棵果樹的果子裝在第二個袋子裡。第三個袋子不用裝了。【輸入輸出樣例解釋2】每個袋子的體積為7即可。前2棵果樹的果子裝在第乙個袋子裡,此時第乙個袋子已經裝了4單位體積的果子,第3棵果樹的果子裝不下了,所以裝進第二個袋子裡,第4棵果樹的果子剛好裝進第二個袋子,第5棵果樹的果子裝進第三個袋子裡。【輸入輸出樣例解釋3】每個袋子的體積為4即可。前3棵果樹的果子裝在第乙個袋子裡,第4~5棵果樹的果子裝在第二個袋子裡,第6棵果樹的果子裝在第三個袋子裡。

【資料範圍】

對於40%的資料,0對於70%的資料,0對於100%的資料,0solution:

這道題是一套題中的第一題,比較簡單。非常明顯是一道二分答案的題。如果v1滿足要求,任意v2>v1一定也滿足,存在v2

#include#include#include#include#include#includeusing namespace std;  

int n,m,num;

long long a[200000],l,r,mid,now;

int main()

while(l>1;

now=0;

num=1;

for(int i=1;i<=n;i++)

if(now+a[i]<=mid)

now+=a[i];

else

if(num<=m)

r=mid;

else

l=mid+1;

} printf("%lld\n",r);

return 0;

}

二分查詢與二分答案

主要用於在乙個單調的函式中查詢某值 連續函式的情況 若當前查詢的區間是 l,r 查詢的值是 y 函式單增 設 mid l r 2 若 f mid y 則 l mid,否則 r mid 直至 r l eps 當前查詢的區間是 l,r 查詢的值是 y 函式單增 設 mid l r 2 若 f mid y...

二分查詢和二分答案

1.解釋 優點 查詢速度快。缺點 待查表為有序表。4.時間複雜度 o log n 5.示例 p2249查詢 include include using namespace std long long n,m,a 1000005 b 100005 l,r,mid,cnt,x intmain for i...

二分與二分答案學習

判斷left,mid,right的符號進行區間的精確。如下為遞迴二分求零點的操作 double find zero point double left,double right,double precesion double mid right left 2 if f mid 0 if f mid ...