果園裏有n顆果樹,每棵果樹都有一個編號i(1≤i≤n)。小明已經把每棵果樹上的果子都摘下來堆在了這棵樹的下方,每棵樹下方的果子體積爲ai。
現在小明將拿來m個袋子把這些果子都裝進袋子裏。每個袋子的體積爲v。小明會按照如下規則把果子裝進袋子裏:
(a)從第1棵果樹開始裝起,由1到n一直裝到第n棵果樹。
(b)如果這棵果樹下的果子能全部裝進當前這個袋子,就裝進去;如果不能,就關上當前這個袋子,打開一個新的袋子開始裝。
小明希望在能把所有果子都裝進袋子裏的前提下,v儘量小。m個袋子並不一定都要裝進果子。
輸入第1行,包含兩個整數n和m。
第2行,包含n個整數ai。
輸出僅1行,表示最小的v。
#1
3 3
1 2 3
#2
5 3
1 3 6 1 7
#3
6 3
1 2 1 3 1 4
#1
3
#2
7
#3
4
【輸入輸出樣例解釋1】
每個袋子的體積爲3即可。前2棵果樹的果子裝在第一個袋子裏,第3棵果樹的果子裝在第二個袋子裏。第三個袋子不用裝了。
【輸入輸出樣例解釋2】
每個袋子的體積爲7即可。前2棵果樹的果子裝在第一個袋子裏,此時第一個袋子已經裝了4單位體積的果子,第3棵果樹的果子裝不下了,所以裝進第二個袋子裏,第4棵果樹的果子剛好裝進第二個袋子,第5棵果樹的果子裝進第三個袋子裏。
【輸入輸出樣例解釋3】
每個袋子的體積爲4即可。前3棵果樹的果子裝在第一個袋子裏,第4~5棵果樹的果子裝在第二個袋子裏,第6棵果樹的果子裝在第三個袋子裏。
【數據範圍】
對於40%的數據,0<m≤n≤1,000,0<ai≤1,000;
對於70%的數據,0<m≤n≤100,000,0<ai≤100,000;
對於100%的數據,0<m≤n≤100,000,0<ai≤1,000,000,000。
然而今天被聖誕樹告炸啦,沒空仔細寫博客了= =
//codevs1766 ×°¹û×Ó ¶þ·Ö
//ÊǵÄ֮ǰд¹ýÁ˵«²»ÐÒµÄÀ¶ÆÁÁË£¬ÎÒÖªµÀÎÒ²»¸Ã¹ÖÂ黨ÌÛµ«ÎÒ¾ÍÊÇÏë¹ÖËû
//copyright by ametake
#include
#include
#include
using namespace std;
const int maxn=100000+10;
long long n,m,a[maxn];
bool can(long long mi)
{
long long cnt=0,v=mi;
int i=1;
while (i<=n)
{
while (a[i]<=v)
{
v-=a[i];
i++;
}
cnt++;
v=mi;
}
return cnt<=m;
}
int main()
{
scanf("%lld%lld",&n,&m);
long long l=0,r=100000000000000ll;
for (int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
if (a[i]>l) l=a[i];
}
while (l
——天見其明,地見其光,君子貴其全也