SDUT 小明的花费预算 2778(二分)
2016-08-18 21:15
162 查看
小明的花费预算
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
小明终于找到一份工作了,但是老板是个比较奇怪的人,他并不是按照每月每月的这样发工资,他觉得你想什么时候来取都可以,而小明恰好是一个花钱比较大手大脚的人,所以他希望每次取得钱正好够接下来的n个月的花费,以防浪费。小明很懒,懒到他连钱都尽量不愿多带(只是嫌沉)。但是他在只有m次取钱的机会,所以他想要用m次把n个月的钱都取出来,但想要每次都尽量少取些。给你小明n个月的花费,还有可取的次数m,问小明在保证每次尽量少取些钱的情况下,最多的那次取了多少钱?当然,每次取钱只能取连续几个月的花费。
输入
多组输入。第一行是两个整数,n(1 ≤ n ≤ 100,000)和m (1 ≤ m ≤ n)
接下来的n行是连续n个月的花费,第i+1行是第i个月的花费。
输出
输出满足最大的总花费最小的那个组的总花费。示例输入
5 3 3 2 9 4 1
示例输出
9
提示
将5个月分为3组,第一组(3,2),第二组(9),第三组(4,1),第二组的总花费最大为9,若按其他的方式分,花费最大的那一组的总花费将>=9.来源
lwn做POJ的3373,想起和这个题是一样的,当时没懂这个题,怎么用二分就能得出答案,今天回头看了看代码,好像懂了。
把n个序列分为m组,求最大一组和为所有情况最小的,这个答案肯定在最大一个月花费和所有花费和的之间,我们就在这个区间二分
看代码
#include<stdio.h> int low,high,mid,i; int n,m, ans; int arr[112345]; void binsearch(int low,int high) { if(low<=high) { mid=low+(high-low)/2; int count,sum; count=1; sum=0; for(i=0; i<n; i++) { if(sum + arr[i]<=mid) sum+=arr[i]; else //如果不小于中间值,说明这一组达到最大的情况,再分下一组 { count++; //记录分了几组 sum=arr[i]; } } if(count>m) //如果分组大于要求的,说明这个中间值下,在(mid+1,high)继续二分 binsearch(mid+1,high); else { ans = mid; //向小分 binsearch(low,mid-1); } } } int main() { while(~scanf("%d%d",&n,&m)) { low=high=0; for(i=0; i<n; i++) { scanf("%d",&arr[i]); if(arr[i]>low) low=arr[i];//最大一个月的花费 high+=arr[i];//花费和 } binsearch(low,high); printf("%d\n",ans); } return 0; }
相关文章推荐
- SDUT 2778-小明的花费预算(二分答案)
- sdut2778 小明的花费预算(二分)
- SDUT 2778 小明的花费预算 二分
- [2778]小明的花费预算 (二分查找)SDUT
- [2778]小明的花费预算 (二分查找)SDUT
- SDUT 2778 小明的花费预算 (二分答案) -- 解题报告
- SDUT 2778 小明的花费预算
- 寒假训练--二分哈希--小明的花费预算
- 小明的花费预算
- SDUT2778 小明的花费预算
- SDUT 2766 小明传奇2
- SDUT 3254 Stars【二维前缀和+二分+暴力枚举】
- CSU1976 -搬运工小明-二分
- SDUT 3376 数据结构实验之查找四:二分查找
- Sdut 3252 Lowest Unique Price【思维+二分+树状数组】
- sdut 2610:Boring Counting(第四届山东省省赛原题,划分树 + 二分)
- SDUT_3376_数据结构实验之查找四:二分查找
- SDUT-3376-->数据结构实验之查找四:二分查找
- 小明的骰子(SDUT 2859)
- 二分练习(SDUT 2781)