POJ3273-Monthly Expense (最小化最大值)
题目链接: cid=80117#problem/E">click here~~
【题目大意】
农夫JF在n天中每天的花费,要求把这n天分作m组。每组的天数必定是连续的。要求分得各组的花费之和应该尽可能地小,最后输出各组花费之和中的最大值
【解题思路】:
经典的最小化最大值问题,要求连续的m个子序列,子序列的和最大值的最小,枚举满足条件的m的最小值即为答案。因此二分查找。
1.能否把序列划分为每一个序列之和不大于mid的m个子序列,
2.通过用当前的mid值能把天数分成几组,
3.比較mid和t的大小,从而确定mid
详细见代码吧:
//#include <bits/stdc++.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int N=1e5+10;
int n,m,num[N];
bool is_part(int mid)
{
int t=0,s=0; //t==当前mid值能把n天分成的组数(初始把所有天数作为0组)
bool ok=true;
for(int i=0; i<n; i++)//遍历每一天的花费
{
if(num[i]>mid){//假设某个值大于,显然不符合
ok=false;
break;
}
if(s+num[i]>mid){//不能再把当前元素加上了
t++;
s=num[i]; //把前i天作为一组
if(t>m-1){ //t=m时退出。即在最后一个元素之前都已经用了m条划分线
ok=false;
break;
}
}
else s+=num[i];//把当前元素与前面的元素加上。以便尽量往右划分,贪心究竟
}
return ok;
}
void judge() //二分查找
{
int ll=0,rr=1e8;
while(ll<rr)
{
int mid=(ll+rr)>>1;
if(is_part(mid)) rr=mid;
else ll=mid+1;
}
printf("%d\n",ll);
}
int main()
{
int maxx=0,sum=0;
scanf("%d%d",&n,&m);
for(int i=0; i<n; i++){
scanf("%d",&num[i]);
sum+=num[i];
maxx=max(maxx,num[i]);
}
if(m==n||m==1) printf("%d\n",maxx);
else judge();
return 0;
}
POJ3273-Monthly Expense (最小化最大值)的更多相关文章
- POJ-3273 Monthly Expense---最小化最大值
		题目链接: https://cn.vjudge.net/problem/POJ-3273 题目大意: 给N个数,划分为M个块(不得打乱数顺序).找到一个最好的划分方式,使得块的和的最大值 最小 解题思 ... 
- POJ 3273 Monthly Expense二分查找[最小化最大值问题]
		POJ 3273 Monthly Expense二分查找(最大值最小化问题) 题目:Monthly Expense Description Farmer John is an astounding a ... 
- Monthly Expense(二分--最小化最大值)
		Farmer John is an astounding accounting wizard and has realized he might run out of money to run the ... 
- poj 3273 Monthly Expense (二分搜索,最小化最大值)
		题目:http://poj.org/problem?id=3273 思路:通过定义一个函数bool can(int mid):=划分后最大段和小于等于mid(即划分后所有段和都小于等于mid) 这样我 ... 
- OJ 21658::Monthly Expense(二分搜索+最小化最大值)
		Description Farmer John是一个令人惊讶的会计学天才,他已经明白了他可能会花光他的钱,这些钱本来是要维持农场每个月的正常运转的.他已经计算了他以后N(1<=N< ... 
- POJ_3273_Monthly_Expense_(二分,最小化最大值)
		描述 http://poj.org/problem?id=3273 共n个月,给出每个月的开销.将n个月划分成m个时间段,求m个时间段中开销最大的时间段的最小开销值. Monthly Expense ... 
- POJ_3104_Drying_(二分,最小化最大值)
		描述 http://poj.org/problem?id=3104 n件衣服,第i件衣服里面有水a[i],自然风干每分钟干1个水,用吹风机每分钟干k个水,但是同时只能对一件衣服使用吹风机,求干完所有衣 ... 
- POJ-3273 Monthly Expense (最大值最小化问题)
		/* Monthly Expense Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10757 Accepted: 4390 D ... 
- [ACM] POJ 3273 Monthly Expense (二分解决最小化最大值)
		Monthly Expense Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 14158 Accepted: 5697 ... 
随机推荐
- centos 如何用 rsyslog 搭建本地日志服务
			一.问题背景 最近项目遇到一个问题,服务器响应很慢,team中的两个有经验的工程师找了一台服务器分析了一下,发现问题出在磁盘写入过于频繁.这里大概介绍一下背景,我们的服务器上面主要是跑各种PHP接口, ... 
- Jquery动画第一部分
			效果图: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.asp ... 
- 对DataTable里数据进行排序
			在日常开发过程中,有一个DataTable集合,里面有很多字段,现在要求针对某一列进行排序,如果该列为数字的话,进行ASC即可实现,但是该字段类型为string,此时排序就有点不正确了. 我也不多废话 ... 
- mssql查找备注(text,ntext)类型字段为空的方法
			在sql语句中,如果查找某个文本字段值为空的,可以用select * from 表 where 字段='' ,但是如果这个字段数据类型是text或者ntext,那上面的sql语句就要出错了. 解决办法 ... 
- ExecutorService与Executors例子的简单剖析
			对于多线程有了一点了解之后,那么来看看java.lang.concurrent包下面的一些东西.在此之前,我们运行一个线程都是显式调用了Thread的start()方法.我们用concurrent下面 ... 
- RPi 2B apache2 mysql php5 and vsftp
			/************************************************************************* * RPi 2B apache2 mysql ph ... 
- AngularJS 拦截器和好棒例子
			目录[-] 什么是拦截器? 异步操作 例子 Session 注入(请求拦截器) 时间戳(请求和响应拦截器) 请求恢复 (请求异常拦截) Session 恢复 (响应异常拦截器) 总结 Intercep ... 
- InstallShield高级应用--检查是否安装ORACLE或SQL Server
			InstallShield高级应用--检查是否安装ORACLE或SQL Server 实现原理:判断是否存在,是通过查找注册表是否含有相应标识来判断的. 注意:XP与WIN7系统注册表保存方式不一 ... 
- HDU 5335  Walk Out
			题意:在一个只有0和1的矩阵里,从左上角走到右下角, 每次可以向四个方向走,每个路径都是一个二进制数,求所有路径中最小的二进制数. 解法:先bfs求从起点能走到离终点最近的0,那么从这个点起只向下或向 ... 
- POJ 2352  Stars
			题意:有一堆星星,每个星星的级别为坐标不高于它且不在它右边的星星个数,求级别为0-n - 1的星星个数. 解法:树状数组.输入的星星坐标已经按y坐标升序排序,y坐标相等的按x升序排序,所以每输入一个数 ... 
