POJ 3273 Monthly Expense 二分查找的应用
2016-02-24 00:06
232 查看
点击打开链接
题意
给出农夫在n天中每天的花费,要求把这n天分作m组,每组的天数必然是连续的,要求分得各组的花费之和应该尽可能地小,最后输出各组花费之和中的最大值
思路:
1 普通枚举(超时)
先把N个值中的最大值Max作为作为分组的最小和,然后暴力分组看看分的组数是不是小于m
如果小于m就找到了
如果不小于 就让Max++;一直枚举到满足条件的值为止
2 二分 枚举不是Max++进行了 ,而是先确定一个最大和与最小和
然后二分判断边界
二分的条件知道上下边界即可
题意
给出农夫在n天中每天的花费,要求把这n天分作m组,每组的天数必然是连续的,要求分得各组的花费之和应该尽可能地小,最后输出各组花费之和中的最大值
思路:
1 普通枚举(超时)
先把N个值中的最大值Max作为作为分组的最小和,然后暴力分组看看分的组数是不是小于m
如果小于m就找到了
如果不小于 就让Max++;一直枚举到满足条件的值为止
2 二分 枚举不是Max++进行了 ,而是先确定一个最大和与最小和
然后二分判断边界
二分的条件知道上下边界即可
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> using namespace std; int a[100010]; int n,m; int judge(int low,int high) { if(low>=high) return low; int sum,num,mid; int zmax=high; while(low<=high) ///勿漏 = { mid=(low+high)/2; sum=0; num=1; for(int i=0; i<n; i++) { if(sum+a[i]<=mid) sum+=a[i]; else { sum=a[i]; num++; } if(num>m) break; } if(num>m) low=mid+1; else ///满足分组条件 { high=mid-1; zmax=min(zmax,mid); ///确定满足分组条件的最小值 } } return zmax; } int main() { // freopen("stdd.txt","r+",stdin); // freopen("std.txt","w+",stdout); while(~scanf("%d%d",&n,&m)) { int low=-1,high=0; for(int i=0; i<n; i++) { scanf("%d",&a[i]); high+=a[i]; low=max(a[i],low); } printf("%d\n",judge(low,high)); } return 0; }
相关文章推荐
- 【CSS3】 CSS3实现“图片阴影”效果
- gulp常用任务
- Arrays常用API的事例
- Python笔记
- 我的大数据之路(三):HDFS文件系统
- CSS3 弹性布局弹性流(flex-flow)属性详解和实例
- Android笔记之Activity
- Arrays.sort的粗略讲解
- 删除linux系统后,启动电脑报error:no such partition grub rescue>解决
- Python实现字典依据value排序
- ASP.NET对SQLServer的通用数据库访问类
- ASP.NET Mvc开发之查询数据
- PHP设计模式之简单投诉页面实例
- 汇总PHPmailer群发Gmail的常见问题
- PHP+MySQL实现的简单投票系统实例
- PHP+JS三级菜单联动菜单实现方法
- PC是夕阳行业?你们图样图森破
- 群里闲聊?真心浪费时间
- 关于RSA、公钥、私钥、加密、签名的那些概念
- 小时候不努力自学,长大了就只能给别人点赞