小明的花费预算
来源:互联网 发布:淘宝格子铺登陆网址 编辑:程序博客网 时间:2024/04/30 14:14
小明的花费预算
Time Limit: 1000MS Memory limit: 65536K
题目描述
小明终于找到一份工作了,但是老板是个比较奇怪的人,他并不是按照每月每月的这样发工资,他觉得你想什么时候来取都可以,取的是前边连续几个月中没有取的工资,而小明恰好是一个花钱比较大手大脚的人,所以他希望每次取得钱正好够接下来的n个月的花费。
所以让你把这n个月分成正好m组。每个组至少包含一个月,每组之中的月份必须是连续的,请你为他分组,使得分得的组中最大的总花费最小。
输入
第一行是两个整数,n(1 ≤ n ≤ 100,000)和m (1 ≤ m ≤ n)
接下来的n行是连续n个月的花费,第i+1行是第i个月的花费。
输出
输出满足最大的总花费最小的那个组的总花费。
示例输入
5 332941
示例输出
9
提示
将5个月分为3组,第一组(3,2),第二组(9),第三组(4,1),第二组的总花费最大为9,若按其他的方式分,花费最大的那一组的总花费将>=9.
分析!!!
利用二分的方法因为最小也是全部每次花费的最大值,最大也超不过它们的和,因此low和high就有了,在选取符合情况的mid,从第一个开始向后加,如果当和>mid,就就从下一个在开始算,并且这种情况出现一次就使s++;最后判断是否s==m;如果满足就继续向下,因为可能满足的情况有多个,但要选取个最接近的,如果是s<m,就说明组数分多了,说明mid小了,如果s>m,就说明组数大了,mid大了!
#include<stdio.h>#include<string.h>#include<stdlib.h>int dp[110000];int main(){ int n,m,i,j; while( ~scanf("%d%d",&n,&m)) { int maxx=0,s=0; for(i=0; i<n; i++) { scanf("%d",&dp[i]); s+=dp[i]; if(dp[i]>maxx) maxx=dp[i]; } int low=maxx,high=s,mid; while(low<=high) { int sum=0; int num=1; mid=(low+high)/2; for(i=0; i<n; i++) { if(sum+dp[i]<=mid) sum+=dp[i]; else { sum=dp[i]; num++; } } if(num>m) { low=mid+1; } if(num<=m) high=mid-1; } printf("%d\n",mid) ; } return 0;}
0 0
- 小明的花费预算
- SDUT2778 小明的花费预算
- 二分答案:小明的花费预算
- SDUT 2778 小明的花费预算
- 寒假训练--二分哈希--小明的花费预算
- sdut2778 小明的花费预算(二分)
- SDUT 2778 小明的花费预算 二分
- [2778]小明的花费预算 (二分查找)SDUT
- SDUT 2778-小明的花费预算(二分答案)
- SDUT 小明的花费预算 2778(二分)
- SDUT 2778 小明的花费预算 (二分答案) -- 解题报告
- 金明的预算
- 金明的预算方案
- 金明的预算方案
- 金明的预算方案
- 金明的预算方案
- 金明的预算方案
- 金明的预算方案
- STL之vector
- 数据结构上机测试4.1:二叉树的遍历与应用1
- linux-------定时备份文件
- Hibernate的flush机制深入
- 【Hadoop技术博客推荐】Hive的那些事
- 小明的花费预算
- POJ 1248 Safecracker
- 2136 数据结构实验之二叉树的建立与遍历
- const定义的常量和#define定义的符号常量的区别(笔记)
- ubuntu 12.04 开启NFS服务&设置
- 软件开发人员真的了解SQL索引吗(索引使用原则)
- Hadoop 2.2.0的安装配置
- OOA/OOD/OOP
- volatile关键字的使用