任務分配

題目描述

圖書館按順序排列有N本書須要維護,每本書的總頁數不相同。現有M位員工。能夠給每一個員工分配連續的一段書籍,讓他進行維護。如今的問題是,怎麼樣分配,工做任務最重(須要維護的頁數最多)的人維護的頁數儘可能少。ios

輸入

第一行兩個數,N、M。接下來N行,每行一個整數,表示一本書的頁數。spa

輸出

任務最重的人最少須要維護的頁數。code


這道題就是求最大那我的最少要維護的數量,顯而易見,二分求答案。it

left=單個a[i]最小。
right=∑a[i]。io

好了,那麼check怎麼寫列?
l=前i個a[i]的和。
若是l>mid那麼j++,l=a[i]。class

接着check就寫完了,接下來stream

你渴望力量嗎?變量

#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
//頭
int a[100000 + 10], m, n, mid;
//定義變量(`-&-感受有點尷尬`)
int check()
{
    int i, j = 1, l = 0;
    for(i = 1; i <= n; i++)
    {
        l += a[i];//加上這一本書
        if(l > mid)//若是超過了預期
            j++, l = a[i];//j++,l從新計數
    }
    if(j <= m) 
    /*若是分這麼多不超過mid的段也分不了,mid就要調整,即返回0*/
    /*形象一點,若,預計每人維護<=mid頁,當沒分完時,減小mid,當不夠分時,mid增長*/
        return 1;//不夠分 mid+
    else 
        return 0;//沒分完 mid-
}

int main()
{
    int i, j, left = 0, right = 0;
   scanf("%d%d", &n, &m);
    for(i = 1;i <= n; i++)
    {
        scanf("%d", &a[i]);
        right += a[i];
        if(a[i] > left) 
            left = a[i];
    }
    //read讀入
    if(m == n)
    {
        printf("%d", left);
        return 0;
    }
    while(left < right)
    {
        mid = (left + right) / 2;
        if(check())
            right = mid;//mid減小
        else 
            left = mid + 1;//mid增大
    }

    printf("%d", right);//答案就在right
    return 0;
}
相關文章
相關標籤/搜索