POJ3273 Monthly Expense(二分答案)
2015-05-15 13:07
337 查看
题目大意:
N个数不改变顺序分成M份,使每一份的和尽可能小
输出和中的最大值
很经典的二分答案,但是感觉二分很容易写错
先求出答案下界,也就是N个数中的最大值(相当于分成N份)
再求出答案上界,也就是N个数的和(相当于分成1份)
二分枚举可能的值
以这个值为和最大值,顺序遍历N个数,求出可以分多少份
如果份数大于M,则将上界往前移
如果份数小于等于M,则将下界往后移
(因为求的是份数等于M的最小值)
N个数不改变顺序分成M份,使每一份的和尽可能小
输出和中的最大值
很经典的二分答案,但是感觉二分很容易写错
先求出答案下界,也就是N个数中的最大值(相当于分成N份)
再求出答案上界,也就是N个数的和(相当于分成1份)
二分枚举可能的值
以这个值为和最大值,顺序遍历N个数,求出可以分多少份
如果份数大于M,则将上界往前移
如果份数小于等于M,则将下界往后移
(因为求的是份数等于M的最小值)
#include <stdio.h> #define MAXN 100010 int arr[MAXN]; int main() { int i,n,m; while(scanf("%d%d",&n,&m)!=EOF) { int cnt,sum,mid,left=0,right=0; for(i=0;i<n;i++) { scanf("%d",&arr[i]); right+=arr[i]; left=arr[i]>left?arr[i]:left; } while(left<right) { mid=(left+right)/2; cnt=1,sum=0; for(i=0;i<n;i++) { if(arr[i]+sum<=mid) sum+=arr[i]; else { sum=arr[i]; cnt++; } } if(cnt<=m) right=mid; else left=mid+1; } printf("%d\n",left); } return 0; }
相关文章推荐
- POJ 3273 Monthly Expense 【二分答案】
- POJ 3273 Monthly Expense【二分答案】
- poj 3273/1064/2456 二分答案(Monthly Expense)
- POJ 3273 Monthly Expense (二分答案)
- poj_3273 Monthly Expense(二分穷举)
- POJ 3273 Monthly Expense(二分)
- POJ 3273 - Monthly Expense(二分)
- 【POJ】3273 - Monthly Expense(二分)
- POJ 3273 Monthly Expense(二分搜索巧妙利用)
- POJ 3273 Monthly Expense (二分最值)
- 【POJ 3273】 Monthly Expense (二分)
- [二分+模拟]poj 3273 Monthly Expense
- poj 3273 Monthly Expense 二分查找
- poj 3273 二分 monthly expense
- poj 3273 Monthly Expense (二分最小化最大值)
- POJ 3273 Monthly Expense (二分&最大化最小值)
- POJ 3273 Monthly Expense(二分查找)
- POJ-3273(二分答案)
- POJ 3273 Monthly Expense【二分】(最大值最小化)
- POJ3273 Monthly Expense 二分