2017.1.12【初中部 】普及组模拟赛C组 抄书 题解
2017-01-13 19:01
267 查看
原题:
http://172.16.0.132/junior/#contest/show/1360/3题目描述:
现有n本书,编号1,2,…,n。每本Pi页。全部分给m个抄写员。每人分到顺序连续的若干本,每本只分给一人。求一种方案,使每人分到的页数和的最大值为最小。输出这个值输入:
第一行两个整数N,M(0输出:
输出最佳方案的值。样例输入:
9 3100 200 300 400 500 600 700 800 900
样例输出:
1700数据范围限制:
对于10%的数据,有N<=10对于50%的数据,有N<=500;
对于100%的数据,有N<=3000;
分析:
我们可以二分答案;L为左边界,R为右边界,
(1)如果L<=R,做第二步
(2)M=(L+R)DIV 2
(3)构造答案为M的方案,从后往前遵循能尽可能多抄的原则,求出所需人数X
(4)如果X<=M,执行R=M-1,否则L=M+1,转入第(1)步
最后的答案为L,,其中P=
;
样例二分过程:
实现:
#include<cstdio> int low,high,mid,i,n,m,a[10000]; int check(int x) { int i,c,s; c=s=0; for(i=0;i<=n;i++) { s+=a[i]; if(s>=x) { if(s>x) i--; s=0; c++; if(c==m) break; } } if(i==n||i==n+1) return 0; else return 1; } int main() { freopen("book.in","r",stdin);freopen("book.out","w",stdout); scanf("%d%d",&n,&m); for(i=1;i<=n;i++) { scanf("%d",&a[i]); high+=a[i]; } low=high/n; while(low<=high) { mid=(low+high)/2; if(check(mid)==0) high=mid-1; else low=mid+1; } printf("%d",low); }
相关文章推荐
- 2017.1.12【初中部 】普及组模拟赛C组 连续自然数和 题解
- 2017.1.12【初中部 】普及组模拟赛C组 简单游戏 题解
- 2017.1.12【初中部 】普及组模拟赛C组 幸运票 题解
- 2017.1.13【初中部 】普及组模拟赛C组 money 最小花费 题解
- 初中OJ1994【普及组模拟赛】小口口矩阵
- 2017.1.12【初中部 GDKOI】模拟赛B组
- 2017.1.13【初中部 】普及组模拟赛C组 maxsum 最大约数和 题解
- 2016.09.03 初中部 NOIP普及组 模拟赛
- 2017.1.13【初中部 】普及组模拟赛C组 excel 电子表格 题解
- 2017.1.15【初中部 】普及组模拟赛C组 小x的数列 题解
- 2017.1.18【初中部 】普及组模拟赛C组 最佳裁判 题解
- 2017.1.15【初中部 】普及组模拟赛C组 小x的极限 题解
- 2016.12.30【初中部 】普及组模拟赛C组题解
- 2017.1.16【初中部 】普及组模拟赛C组 chicken 题解
- 2017.1.18【初中部 】普及组模拟赛C组 临时工计划 题解
- 2017.1.20【初中部 】普及组模拟赛C组 鸡腿の树荫 题解
- 2017.1.16【初中部 】普及组模拟赛C组 match 题解
- 2017.1.18【初中部 】普及组模拟赛C组 捉迷藏 题解
- 2017.1.20【初中部 】普及组模拟赛C组 晒衣服 题解
- 2016.10.05【初中部 NOIP普及组 】模拟赛总结