题目大意:

N ( 1 ≤ N ≤ 100,000 )个 工作日 ,分M ( 1 ≤ M ≤ N ) 个 清算月

一个 清算月 包含一个工作日或更多连续的工作日,每一个工作日都仅被包含在一个 清算月 当中。

按顺序分组,得到一个最大值最小化的月度开支(即 在 所有可能的分组结果的最大值 中得到一个最小的)

Input

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

Output

Line 1:   The smallest possible monthly limit Farmer John can afford to live with.

Sample Input

7 5
100
400
300
100
500
101
400

Sample Output

500

Hint

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的更多相关文章

  1. BZOJ1639: [Usaco2007 Mar]Monthly Expense 月度开支

    1639: [Usaco2007 Mar]Monthly Expense 月度开支 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 529  Solved: ...

  2. BZOJ 1639: [Usaco2007 Mar]Monthly Expense 月度开支( 二分答案 )

    直接二分答案然后判断. ----------------------------------------------------------------------------- #include&l ...

  3. 1639: [Usaco2007 Mar]Monthly Expense 月度开支

    1639: [Usaco2007 Mar]Monthly Expense 月度开支 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 593  Solved: ...

  4. BZOJ【1639】: [Usaco2007 Mar]Monthly Expense 月度开支

    1639: [Usaco2007 Mar]Monthly Expense 月度开支 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 700  Solved: ...

  5. POJ-3273 Monthly Expense (最大值最小化问题)

    /* Monthly Expense Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10757 Accepted: 4390 D ...

  6. Divide and Conquer:Monthly Expense(POJ 3273)

    Monthly Expense 题目大意:不废话,最小化最大值 还是直接套模板,不过这次要注意,是最小化最大值,而不是最大化最小值,判断的时候要注意 联动3258 #include <iostr ...

  7. Monthly Expense(二分查找)

    Monthly Expense Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17982 Accepted: 7190 Desc ...

  8. POJ 3273 Monthly Expense(二分查找+边界条件)

    POJ 3273 Monthly Expense 此题与POJ3258有点类似,一开始把判断条件写错了,wa了两次,二分查找可以有以下两种: ){ mid=(lb+ub)/; if(C(mid)< ...

  9. [ACM] POJ 3273 Monthly Expense (二分解决最小化最大值)

    Monthly Expense Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14158   Accepted: 5697 ...

随机推荐

  1. Java-Class-E:org.springframework.http.HttpStatus

    ylbtech-Java-Class-E:org.springframework.http.HttpStatus 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部 1. /* * C ...

  2. 2019牛客多校第三场B-Crazy Binary String(前缀和+思维)

    Crazy Binary String 题目传送门 解题思路 把1记为1,把0记为-1,然后求前缀和,前缀和相等的就说明中间的01数一样.只要记录前缀和数值出现的位置即可更新出答案. 代码如下 #in ...

  3. 剑指offer第二版面试题10:斐波那契数列(JAVA版)

    题目:写一个函数,输入n,求斐波那契数列的第n项.斐波那契数列的定义如下: 1.效率很低效的解法,挑剔的面试官不会喜欢 使用递归实现: public class Fibonacci { public ...

  4. IceCTF-Matrix

    解题思路: 参考了鸽子小姐姐的脚本:https://zhuanlan.zhihu.com/p/22678856 具体题目就不贴了. 题目中提示将问题图像化,猜测是将这些16进制数转化为图像,尝试将16 ...

  5. Python脚本轻松实现批量图片重命名

    ************************************************************************** 摘要:网上爬取的图片名字很混乱,格式也比较多,需要 ...

  6. 20140702 赋值构造函数的形参为什么一定用引用。string类的赋值运算函数的注意点

    1.复制构造函数为什么一定要用引用,而不是用值 类名::复制构造函数(类名&引用名) 传递引用,可以避免复制,如果一个数据相当大的化,进行复制会浪费很多时间的. 类名::复制构造函数(类名 变 ...

  7. hdu6315 /// 线段树区间更新

    题目大意: 给定n q 为序列的个数和操作的个数 给定n个数的序列b[]作为分母 初始全为0的序列a[]作为分子 两种操作 add l r 为a[]的l到r区间全部+1 query l r 为查询l到 ...

  8. The J2EE Architecture

  9. js单击时页面的弹出

    <!DOCTYPE html><html>      <head>         <script language="JavaScript&quo ...

  10. vue App项目 首页

    1. 下载 npm i mint-ui -S 2. 引入 import MintUI from 'mint-ui' import 'mint-ui/lib/style.css' Vue.use(Min ...