废品回收
试题描述
|
江北榨油厂每天会产生一批废料,厂方会按照日期批次封装起来等待回收。现在积攒了n天的废料,厂里财务记录下了每天产生废料合同价值。现在回收站委托星空运输公司将这n天的废料分m次回收,要求按照日期的先后顺序回收,回收站每次拨给运输公司的经费是一个定值ans,油厂老板每次允许运走的废料是不允许赊账的,所以运输公司每次运走的废料价值一定不会超过ans,若运输公司想运走第i天的废料,必须运走第i天及之前所有还没有运走的废料。对回收站来说,他的拨款不但要保证运输公司能够恰好m次运回所有的废料,而且拨款越少越好。请你编写程序求出符合回收站要求的每次拨款数额。
|
输入
|
第一行输入两个用空格隔开的正整数n和m 接下来有n个由空格隔开不超过10000正整数,依次表示每一天产生废料的价值。
|
输出
|
输出包含一个整数,即回收站每次拨款的数额
|
输入示例
|
7 5 100 400 300 100 500 101 400
|
输出示例
|
500
|
其他说明
|
数据范围:1<=m<=n<=100000
|
#include <iostream> #include <cstdio> #include <cmath> using namespace std; int a[100005],m,n; bool flag(int x) { int sum=0,step=1; for(int i=1;i<=n;i++) { if(a[i]>x) return 0; if(sum+a[i]<=x) sum+=a[i]; else { sum=a[i]; step++; if(step>m) return 0; } } return 1; } int main() { int tail=0; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); tail+=a[i]; } int head=0,mid; while(head+1<tail) { mid=(head+tail)/2; if(flag(mid)==1) tail=mid; else head=mid; } printf("%d",tail); //system("pause"); }