标签:std printf ios 一段 include 工作 调整 任务 书籍
图书馆按顺序排列有N本书需要维护,每本书的总页数不相同。现有M位员工。可以给每个员工分配连续的一段书籍,让他进行维护。现在的问题是,怎么样分配,工作任务最重(需要维护的页数最多)的人维护的页数尽量少。
第一行两个数,N、M。接下来N行,每行一个整数,表示一本书的页数。
任务最重的人最少需要维护的页数。
这道题就是求最大那个人最少要维护的数量,显而易见,二分求答案。
left=单个a[i]最小。
right=∑a[i]。
好了,那么check怎么写列?
l=前i个a[i]的和。
如果l>mid那么j++,l=a[i]。
接着check就写完了,接下来
你渴望力量吗?
#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;
}
标签:std printf ios 一段 include 工作 调整 任务 书籍
原文地址:https://www.cnblogs.com/Areds/p/12114798.html