USACO2007 Monthly Expense /// 二分法 oj21658
题目大意:
共N ( 1 ≤ N ≤ 100,000 )个 工作日 ,分M ( 1 ≤ M ≤ N ) 个 清算月
一个 清算月 包含一个工作日或更多连续的工作日,每一个工作日都仅被包含在一个 清算月 当中。
按顺序分组,得到一个最大值最小化的月度开支(即 在 所有可能的分组结果的最大值 中得到一个最小的)
Line 1: Two space-separated integers: N and M
Lines 2..N+1: Line i+1 contains the number of dollars Farmer John spends on the i-th day
Line 1: The smallest possible monthly limit Farmer John can afford to live with.
7 5
100
400
300
100
500
101
400
500
If Farmer John schedules the months so that the first two days are a month, the third and fourth are a month, and the last three are their own months, he spends at most $500 in any month. Any other method of scheduling gives a larger minimum monthly limit.
思路来自:http://hzwer.com/2661.html
#include <bits/stdc++.h>
using namespace std;
int n,m,ans,a[];
int judge(int mid)
{
int sum=,cnt=;
for(int i=;i<=n;i++)
{
if(sum+a[i]<=mid) sum+=a[i];
/// 连加 分为一组 直到该组总和大于mid
else
{
sum=a[i]; cnt++; ///cnt记下组数 sum从a[i]开始重新连加
if(cnt>m || sum>mid) return ;
/// 若组数超过m 或 有比mid更大的花费 返回0
}
}
return ;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
int le=,rig=;
while(le<=rig) ///不断缩小范围直到找到答案
{
int mid=(le+rig)>>;
///取中值 mid小了就le=mid+1向右找 否则就rig=mid-1向左找
if(judge(mid)) /// 若返回1 mid>=答案
{
ans=mid; /// 先保存mid
rig=mid-;
///若此时mid=答案 而rig=mid-1了 继续循环在judge()时只会进入else部分直到跳出循环。否则mid大了 继续缩小直到得到mid=答案。
}
else le=mid+; /// 若返回0 则花费中有比mid更大的 mid小了
}
printf("%d\n",ans); return ;
}
在一场比赛时用了这个方法,一直超时,其实可以在左右值上加个小优化
#include <bits/stdc++.h>
using namespace std;
int n,m,ans,a[];
int judge(int mid)
{
int sum=,cnt=;
for(int i=;i<=n;i++)
{
if(sum+a[i]<=mid) sum+=a[i];
/// 连加 分为一组 直到该组总和大于mid
else
{
sum=a[i]; cnt++; ///cnt记下组数 sum从a[i]开始重新连加
if(cnt>m || sum>mid) return ;
/// 若组数超过m 或 有比mid更大的花费 返回0
}
}
return ;
}
int main()
{
scanf("%d%d",&n,&m);
int le=,rig=;
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
le=min(le,a[i]);
rig+=a[i];
}
while(le<=rig) ///不断缩小范围直到找到答案
{
int mid=(le+rig)>>;
///取中值 mid小了就le=mid+1向右找 否则就rig=mid-1向左找
if(judge(mid)) /// 若返回1 mid>=答案
{
ans=mid; /// 先保存mid
rig=mid-;
///若此时mid=答案 而rig=mid-1了 继续循环在judge()时只会进入else部分直到跳出循环。否则mid大了 继续缩小直到得到mid=答案。
}
else le=mid+; /// 若返回0 则花费中有比mid更大的 mid小了
}
printf("%d\n",ans); return ;
}
USACO2007 Monthly Expense /// 二分法 oj21658的更多相关文章
- BZOJ1639: [Usaco2007 Mar]Monthly Expense 月度开支
1639: [Usaco2007 Mar]Monthly Expense 月度开支 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 529 Solved: ...
- BZOJ 1639: [Usaco2007 Mar]Monthly Expense 月度开支( 二分答案 )
直接二分答案然后判断. ----------------------------------------------------------------------------- #include&l ...
- 1639: [Usaco2007 Mar]Monthly Expense 月度开支
1639: [Usaco2007 Mar]Monthly Expense 月度开支 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 593 Solved: ...
- BZOJ【1639】: [Usaco2007 Mar]Monthly Expense 月度开支
1639: [Usaco2007 Mar]Monthly Expense 月度开支 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 700 Solved: ...
- POJ-3273 Monthly Expense (最大值最小化问题)
/* Monthly Expense Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10757 Accepted: 4390 D ...
- Divide and Conquer:Monthly Expense(POJ 3273)
Monthly Expense 题目大意:不废话,最小化最大值 还是直接套模板,不过这次要注意,是最小化最大值,而不是最大化最小值,判断的时候要注意 联动3258 #include <iostr ...
- Monthly Expense(二分查找)
Monthly Expense Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17982 Accepted: 7190 Desc ...
- POJ 3273 Monthly Expense(二分查找+边界条件)
POJ 3273 Monthly Expense 此题与POJ3258有点类似,一开始把判断条件写错了,wa了两次,二分查找可以有以下两种: ){ mid=(lb+ub)/; if(C(mid)< ...
- [ACM] POJ 3273 Monthly Expense (二分解决最小化最大值)
Monthly Expense Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 14158 Accepted: 5697 ...
随机推荐
- mysql笔试题大餐---1、组合查询方式及having
mysql笔试题大餐---1.组合查询方式及having 一.总结 一句话总结: 实践:我之前的mysql真的学的太浅了,这种情况下,依据实践(做题)才是唯一能把它学好的方式 学的暂时够了,以实践而学 ...
- 用 Flask 来写个轻博客 (1) — 创建项目
目录 目录 前言 扩展阅读 部署开发环境 创建 Github 项目 前言 一步一步的实现一个 Flask 轻博客项目启动,最新的代码会上传到 Github. 扩展阅读 欢迎使用 Flask - vir ...
- IdentityServer4认证服务器集成Identity&配置持久化数据库
文章简介 asp.net core的空Web项目集成相关dll和页面文件配置IdnetityServer4认证服务器 Ids4集成Identity Ids4配置持久化到数据库 写在最前面,此文章不详细 ...
- 2017 ICPC Asia Urumqi A.coins (概率DP + 期望)
题目链接:Coins Description Alice and Bob are playing a simple game. They line up a row of nn identical c ...
- 拾遗:Docker 基本应用
https://wiki.gentoo.org/wiki/Docker 检查内核内核选项 exec /usr/share/docker/contrib/check-config.sh 使用 btrfs ...
- Day 22: 软件开发目录设计规范
软件开发目录设计 对于提高项目可读性.可维护性的要求就很高了.”项目目录结构”其实也是属于”可读性和可维护性”的范畴,我们设计一个层次清晰的目录结构,就是为了达到以下两点: 可读性高: 不熟悉这个项目 ...
- 用CSS3制作50个超棒动画效果教程
这50个CSS动画集合可以让你通过使用JavaScript函数来让动画更生动.为了能够预览到这些惊人的CSS3技术带来的动画特效,请大家使用如Safari和Chrome这类基于WebKit内核的浏览器 ...
- 伪类checked
困惑了好久的复选框自定义样式终于有了谜底,原来就是一个 :checked 伪类 他的意思就是 匹配任意被勾选/选中的radio(单选按钮),chexked(复选框),或者option(select项) ...
- VS2012在win7 64位机中x86和x64下基本类型的占用空间大小(转)
VS2012在win7 64位机中x86和x64下基本类型的占用空间大小 #include "stdafx.h" #include <windows.h> int _t ...
- pandas--层次化索引
层次化索引是pandas的一项重要功能,它使你能在一个轴上拥有多个(两个以上)索引级别. 创建一个Series,并用一个由列表或数组组成的列表作为索引. data=Series(np.random.r ...