POJ 3273 Monthly Expense 【二分答案】
2015-05-31 19:42
459 查看
题意:给出n天的花费,需要将这n天的花费分成m组,使得每份的和尽量小,求出这个最小的和
看题目看了好久不懂题意,最后还是看了题解
二分答案,上界为这n天花费的总和,下界为这n天里面花费最多的那一天
如果mid>=m,说明mid偏小,l=mid+1,
如果mid<m,说明mid偏大,r=mid,
View Code
看题目看了好久不懂题意,最后还是看了题解
二分答案,上界为这n天花费的总和,下界为这n天里面花费最多的那一天
如果mid>=m,说明mid偏小,l=mid+1,
如果mid<m,说明mid偏大,r=mid,
#include<iostream> #include<cstdio> #include<cstring> #include <cmath> #include<stack> #include<vector> #include<map> #include<set> #include<queue> #include<algorithm> using namespace std; typedef long long LL; const int INF = (1<<30)-1; const int mod=1000000007; const int maxn=1000005; int a[maxn]; int n,m,k; int ok(int v){ int ans=0; int cnt=0; for(int i=1;i<=n;i++){ ans+=a[i]; if(ans>v){ ans=a[i]; cnt++; } } if(cnt>=m) return 0; return 1; } int main(){ while(scanf("%d %d",&n,&m)!=EOF){ int minn=-1,maxx=0; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); maxx+=a[i]; minn=max(minn,a[i]); } LL l=minn,r=maxx,mid; while(l<r){ mid=(l+r)/2; if(ok(mid)) r=mid; else l=mid+1; // printf("l=%d\n",l); // printf("r=%d\n",r); // printf("mid=%d\n",mid); } printf("%I64d\n",l); } return 0; }
View Code
相关文章推荐
- 移植iproute2-4.0
- 百度3道算法题求解
- tcpdump抓包
- Ubuntu 14.04安装Skype
- zzzzw_在线考试系统②管理员篇章
- 利用开源项目jadx反编译Android应用
- 算法导论 10.4-3 输出二叉树的每个结点的关键字
- Android开发--IntentService的用法,你错过了什么
- Java NIO 05=====通道之间的数据传输
- [leetcode] Contains Duplicate
- 2015 百度之星 1003 序列变换 二分
- spring junit 做单元测试,报 Failed to load ApplicationContext 错误。
- PHP中include和require的区别详解
- java ButtonGroup及JRadioButton用法
- Hibernate各种主键生成策略与配置详解
- Docker解析及轻量级PaaS平台演练(一)--Docker简介与安装
- 第十三周项目2-形状类族的中的纯虚函数
- Java小程序:打印空心菱形
- 浅析Context及可能带来的内存泄漏问题
- Docker解析及轻量级PaaS平台演练(一)--Docker简介与安装