【基礎練習】【二分】codevs1766 裝果子題解

題目描述 Description

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

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

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

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

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

輸入描述 Input Description

輸入第1行,包含兩個整數nm

第2行,包含n個整數ai

輸出描述 Output Description

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

樣例輸入 Sample Input

#1

3 3

1 2 3

#2

5 3

1 3 6 1 7

#3

6 3

1 2 1 3 1 4

樣例輸出 Sample Output

#1

3

#2

7

#3

4

數據範圍及提示 Data Size & Hint

【輸入輸出樣例解釋1】

每個袋子的體積爲3即可。前2棵果樹的果子裝在第一個袋子裏,第3棵果樹的果子裝在第二個袋子裏。第三個袋子不用裝了。

 

【輸入輸出樣例解釋2】

每個袋子的體積爲7即可。前2棵果樹的果子裝在第一個袋子裏,此時第一個袋子已經裝了4單位體積的果子,第3棵果樹的果子裝不下了,所以裝進第二個袋子裏,第4棵果樹的果子剛好裝進第二個袋子,第5棵果樹的果子裝進第三個袋子裏。

 

 【輸入輸出樣例解釋3】

每個袋子的體積爲4即可。前3棵果樹的果子裝在第一個袋子裏,第4~5棵果樹的果子裝在第二個袋子裏,第6棵果樹的果子裝在第三個袋子裏。

 【數據範圍】

對於40%的數據,0<mn≤1,000,0<ai≤1,000;

對於70%的數據,0<mn≤100,000,0<ai≤100,000;

對於100%的數據,0<mn≤100,000,0<ai≤1,000,000,000。

這道題目也是很基礎的二分,關鍵是注意由於數據很大,需要開long long 賦值要在大數字後加ll

然而今天被聖誕樹告炸啦,沒空仔細寫博客了= =

//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

——天見其明,地見其光,君子貴其全也




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章