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 ...
随机推荐
- 用java进行测试php写的接口
<?php /* * @Author: anchen * @Date: 2018-07-06 13:53:19 * @Last Modified by: anchen * @Last Modif ...
- Java学习之集合(LinkedList链表集合)
一.什么是链表集合,通过图形来看,比如33只知道它下一个是55 如果:现在要删除33的话,就是把55赋值给45,这样看它操作集合速度会非常快. 二.LinkedList特有方法 1.添加 addFir ...
- ocaml学习
ocaml与haskell一样,是functional programming的代表. 对于有一定编程经验的人来说,入手一种新语言,最有效的方式就是开发一些实用的utility,因此top-level ...
- 并发编程(六)——进程/线程池、协程、gevent第三方库
进程/线程池.协程.gevent第三方库 一.进程/线程池 1.进程池 (1)什么是进程池 如果需要创建的子进程数量不大,可以直接利用multiprocess中的Process来创建.但是当需要创建上 ...
- 结合Poi实现可读取Excel的文件选择对话框
第一步:ApachePoi的jar包导全,不全会出现异常. 第二步:写就完事了:此例为读取特定模板的excel,仅供参考,根据实际需求改写. package 自建包; import java.awt. ...
- 8、如何实现可迭代对象和迭代器对象 9、如何使用生成器函数实现可迭代对象 10、如何进行反向迭代以及如何实现反向迭代 11、如何对迭代器做切片操作 12、如何在一个for语句中迭代多个可迭代对象
8.如何实现可迭代对象和迭代器对象 PS:注意重载Iterator方法的时候,需要和原来的方法名一样,否则创建实例时会报错 from collections import Iterator,Itera ...
- pytest_fixture--scope="session"
import pytest@pytest.fixture(scope="session")def login(): print("\n输入用户名密码登陆! configt ...
- Java 四种内部类
静态内部类:类中静态类 成员内部类:类中非静态类 局部内部类:类中方法中有名字的类 匿名内部类:类中方法中无名的类 引言:在Java中通常情况下,一个类中会有属性和方法,但还可以包含内部类,内部类可以 ...
- keras 或 tensorflow 调用GPU报错:Blas GEMM launch failed
GPU版的tensorflow在模型训练时遇到Blas GEMM launch failed错误,或者keras遇到相同错误(keras 一般将tensorflow作为backend,如果安装了GPU ...
- 创建maven项目的时候:Could not resolve archetype org.apache.maven.archetypes:maven-archetype-webapp:1.0 from any of the configured repositories. 解决办法
问题: https://yq.aliyun.com/ziliao/364921 尝试没成功. https://www.aliyun.com/jiaocheng/296712.html 尝 ...