题目:http://poj.org/problem?id=3273

当分成的组数越多,所有组的最大值就会越小或不变,这一点不难证明:
    如果当前分成了group组,最大值是max,那么max的这一组天数>=1,这时把max的这一组再分成2组,总的组数变成了group+1,最大值显然会减小或不变(当还有另一组是max或者max组只包含一天时不变)。
    所以组数和本题的答案是单调的关系。
    设答案在区间[low, high],不难看出low是花费最多的一天的值,high是每天花费的总和。这样二分寻找答案,效率肯定是很高的。本题确实比较难理解,看了一个小时才差不多理解了,更多二分的细节在代码注释中。

  

 #include <stdio.h>
#include <string.h> int n, m; //把n天分成m组
int money[]; //每天的钱数 //假设答案是mid,验证是否正确
//为了便于说明,设正确答案为ans
bool judge(int mid)
{
//sum表示一组的花费,cnt表示分的组数
int sum = , cnt = ;
for(int i = ; i < n; i++)
{
//因为假设答案是mid,所以当sum + money[i] <= mid时,第i天可以分到上一组中。
//这一点很显然,剩下的天数少了,ans当然会更优
if(sum + money[i] <= mid)
sum += money[i]; //如果第i天不能分到上一组,那么只能再分下一组了,这时组数+1
else
{
sum = money[i];
cnt++;
}
}
//如果分的组数>m,显然这时假设的答案mid太小了,所以mid要增大
if(cnt > m)
return ; //否则cnt<=m。
//如果cnt<m,根据上面说的单调关系,分更多的组ans会更优,即mid<ans
//如果cnt==m,说明此时可以在分m组的情况下ans<=mid,这时继续尝试在[low,mid]寻找ans
else
return ;
} int main()
{
int low = , high = ;
scanf("%d %d", &n, &m);
for(int i = ; i < n; i++)
{
//输入每天的花费,计算low和high
scanf("%d", &money[i]);
if(low < money[i])
low = money[i];
high += money[i];
} //二分寻找答案,循环在low==high时结束,这时low和high的值都是答案,输出其中一个就可以
while(low < high)
{
//设答案是mid
int mid = (high + low) / ;
if(judge(mid))
high = mid;/*这里有一点不理解,为什么网上大多数代码写的high=mid-1也是正确的,
如果是在judge中提到的cnt==m的情况,那么ans是<=mid的啊,为什么ans所
在的区间可以跳过mid这个点呢?请知道的回复我,谢谢。*/
else
low = mid + ;
}
//输出high也可以
printf("%d\n", low);
return ;
}

补充一下我对 POJ 3273 的理解,这肯定是我一生写的最多的题解。。。的更多相关文章

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

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

  2. poj 1696 叉积理解

    Space Ant Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3967   Accepted: 2489 Descrip ...

  3. 二分搜索 POJ 3273 Monthly Expense

    题目传送门 /* 题意:分成m个集合,使最大的集合值(求和)最小 二分搜索:二分集合大小,判断能否有m个集合. */ #include <cstdio> #include <algo ...

  4. 【POJ 3273】 Monthly Expense (二分)

    [POJ 3273] Monthly Expense (二分) 一个农民有块地 他列了个计划表 每天要花多少钱管理 但他想用m个月来管理 就想把这个计划表切割成m个月来完毕 想知道每一个月最少花费多少 ...

  5. POJ 3273 Monthly Expense二分查找[最小化最大值问题]

    POJ 3273 Monthly Expense二分查找(最大值最小化问题) 题目:Monthly Expense Description Farmer John is an astounding a ...

  6. POJ 3273 Monthly Expense 二分枚举

    题目:http://poj.org/problem?id=3273 二分枚举,据说是经典题,看了题解才做的,暂时还没有完全理解.. #include <stdio.h> #include ...

  7. poj 3273 Monthly Expense(贪心+二分)

    题目:http://poj.org/problem?id=3273 题意:把n个数分成m份,使每份的和尽量小,输出最大的那一个的和. 思路:二分枚举最大的和,时间复杂度为O(nlog(sum-max) ...

  8. poj 3273 Monthly Expense (二分搜索,最小化最大值)

    题目:http://poj.org/problem?id=3273 思路:通过定义一个函数bool can(int mid):=划分后最大段和小于等于mid(即划分后所有段和都小于等于mid) 这样我 ...

  9. POJ 3273 Monthly Expense(二分搜索)

    Description Farmer John is an astounding accounting wizard and has realized he might run out of mone ...

随机推荐

  1. sed命令详解及应用实例

    第一部分:Sed基本用法 sed是非交互式的编辑器.它不会修改文件,除非使用shell重定向来保存结果.默认情况下,所有的输出行都被打印到屏幕上. sed编辑器逐行处理文件(或输入),并将结果发送到屏 ...

  2. Android 系统状态栏一体化

    Android4.4新特性,系统状态栏一体化. 实现的步骤主要有以下几点: 1.android4.4 以上版本 2.设置app全屏: 方法:在AndroidManifest.xml中设置android ...

  3. StringBuffer与StringBuilder之间的区别

    public class Test { public static void main(String[] args) { StringBuffer strBuffer = new StringBuff ...

  4. Eclipse下使用Hadoop单机模式调试MapReduce程序

    在单机模式下Hadoop不会使用HDFS,也不会开启任何Hadoop守护进程,所有程序将在一个JVM上运行并且最多只允许拥有一个reducer 在Eclipse中新创建一个hadoop-test的Ja ...

  5. I2C Verilog的实现(一)

    <span style="font-size:14px;">`timescale 1ns / 1ps module test( sda ); reg scl; inou ...

  6. 基于JAVA WEB的医药管理系统

    学习上可以模仿,但是不可以抄袭! 附加百度链接:http://wenku.baidu.com/link?url=_r44vGCi8pcm6o44YCvkcHGoT_XhB8jURnweao2YVo1j ...

  7. 20160330javaweb之session 小练习

    练习一:session 实现登录注销 package com.dzq.session.logout; import java.util.*; public class UserDao { /** * ...

  8. DLL使用总结

    最近项目中使用到了DLL,因此就把最近一段时间的学习总结一下,以备不时之需. 一.相关概念 1.动态链接库 自从微软推出第一个版本的Windows操作系统以来,动态链接库(DLL)一直是Windows ...

  9. html + ashx 实现Ajax省市联动

    基本思路:1.了解数据库中省和市的表结构及关联主键 2.创建html页面及select标签 3.通过ajax向ashx(一般处理程序)发送后台请求完成联动效果 表结构: 这里,开始创建一个命为demo ...

  10. OC 知识点回顾

    /* 字符串: NSString  不可变字符串  字符串对象的内容不能修改,字符串的指针可以改变 NSMutableString 可变字符串   可以修改字符串对象的内容,继承自NSString , ...