题目: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. 漏洞大爆光:QQ漏洞、飞秋漏洞、360浏览器劫持…

    随着互联网应用的高速发展,信息安全已深入到诸多领域,前段时间发生的"Struts 2"漏洞及"心脏出血"漏洞影响了二亿中国网民的信息安全.原因是程序猿缺少细致的 ...

  2. Top 10 questions about Java Collections--reference

    reference from:http://www.programcreek.com/2013/09/top-10-questions-for-java-collections/ The follow ...

  3. overflow: hidden用法,不仅仅是隐藏溢出

    overflow:hidden是大家常用到的CSS样式,但是大多数人对这个样式的理解仅仅局限于隐藏溢出,而对于清除浮动这个含义不是很了解. <!DOCTYPE html> <html ...

  4. Java并发——线程安全、线程同步、线程通信

    线程安全 进程间"共享"对象 多个“写”线程同时访问对象. 例:Timer实例的num成员,即add()方法是用的次数.即Timer实例是资源对象. class TestSync ...

  5. Memcached原理

    Memcached是一套高性能的.分布式内存对象缓存系统.它由C写成,以Key/Value的方式将数据储存在内存中. 一.Memcached特性 Memcached作为高速运行的分布式缓存服务器,具有 ...

  6. 首页的sitecontent地址

    当无法出现工具栏时,利用url地址,可以方便直接进入sitecontent http://sp2013/sites/bentest/_layouts/15/viewlsts.aspx

  7. EF中使用数据库的标量值函数

    参考资料:https://msdn.microsoft.com/zh-cn/library/dd456847(v=vs.110).aspx http://stackoverflow.com/quest ...

  8. SQLServer获取最后插入的ID值SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY的比较

    IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值.IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表. @@IDENTITY 返回为当前会话的所有作用 ...

  9. (转) ASP.NET页面缓存

    原文:http://www.cnblogs.com/Sky_KWolf/archive/2010/12/05/1897158.html 静态页面全部内容保存在服务器内存中.当再有请求时,系统将缓存中的 ...

  10. ACM/ICPC ZOJ1006-Do the Untwist 解题代码

    #include <iostream> #include <string> #include <stdlib.h> using namespace std; int ...