poj3273 二分

Monthly Expense

Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 21448   Accepted: 8429

Description

Farmer John is an astounding accounting wizard and has realized he might run out of money to run the farm. He has already calculated and recorded the exact amount of money (1 ≤ moneyi ≤ 10,000) that he will need to spend each day over the next N (1 ≤ N ≤ 100,000) days.

FJ wants to create a budget for a sequential set of exactly M (1 ≤ MN) fiscal periods called "fajomonths". Each of these fajomonths contains a set of 1 or more consecutive days. Every day is contained in exactly one fajomonth.

FJ‘s goal is to arrange the fajomonths so as to minimize the expenses of the fajomonth with the highest spending and thus determine his monthly spending limit.

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 ith 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.

Source

USACO 2007 March Silver

题目大意:给你未来n天FJ每天需要花费的钱的数目,FJ想要将这些天划分成k个时期,问你划分之,

花钱最多的那一段日子钱数最少是多少。(最大值最小化问题)

思路分析:很明显的二分,类似的最小值最大化最大值最小化,而且看一下数据范围,同时一般还会给出一个限制条件

让你写check函数,如本题中k值就是check函数中的判断条件,弱很快敲完,但还是wa了两发,最近一直在做二分的

题目,每道题总会wa几发,教我点做人道理,本题弱wa在在了二分初始区间的确定上,本来我以为二分初始区间尽量

大些,将答案包含进去就没问题了,所以直接不假思索将左边界赋成了0,结果wa了,后面想明白了,初始区间确实可

以大些,但是你一旦把那些根本不可能的答案包含进去,check函数写起来就要麻烦的多,我写的check函数是建立在

x>a[maxn]的情况下的,但是区间却没有这样选择,因此以后为了避免不必要的麻烦,还是将初始区间定的精确一些。

代码:

#include <iostream>
#include<algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
using namespace std;
const int maxn=100000+100;
int a[maxn];
int n,k;
bool check(__int64 x)
{
    int t=0;
    __int64 sum=0;
    for(int i=0;i<n;i++)
    {
        sum+=a[i];
        if(sum>x)
        {
            sum=a[i];
            t++;
        }
    }
    if(t+1>k) return false;
    else return true;
}
int main()
{
    while(~scanf("%d%d",&n,&k))
    {
        __int64 sum=0;
        int ma=0;
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            if(ma<a[i])ma=a[i];
            sum+=a[i];
        }
        __int64 l=ma,r=sum;
        __int64 ans;
        while(l<=r)
        {
            __int64 mid=(l+r)>>1;
            if(check(mid)) ans=mid,r=mid-1;
            else l=mid+1;
        }
        printf("%d\n",ans);
    }
    return 0;
}

时间: 2024-12-29 09:13:59

poj3273 二分的相关文章

POJ3273——二分——Monthly Expense

Farmer John is an astounding accounting wizard and has realized he might run out of money to run the farm. He has already calculated and recorded the exact amount of money (1 ≤ moneyi ≤ 10,000) that he will need to spend each day over the next N (1 ≤

POJ3273 MonthlyExpense 【裸二分但易错】

详见blog.csdn.net/lyy289065406/article/details/6648554,也就一简单的很裸的二分... 以前看到一句话,90%的程序员会写错二分程序,果不其然,虽然前面二分都写对了,但这个确实卡了一下,还好去洗个澡回来就想出来了,哇哈哈哈 这个要注意,在L<R-1的时候就应该终止二分循环,然后手动选择答案(也就是说有时候二分最后一步需要自己手动选择答案) #include <iostream> #include <cstdio> #includ

poj3273——经典的二分优化

poj3273——经典的二分优化 Monthly Expense Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16522   Accepted: 6570 Description Farmer John is an astounding accounting wizard and has realized he might run out of money to run the farm. He has already

poj3273 Monthly Expense 二分查找

题目链接 题意:给出n组数据,每组有一个数,有多种方法通过将连续的几组数据并为一组使得组数从n减少至k,每组数据的值为其组中数据之和,每种方法得到的k组数据都有最大的一组数据和m,求这些方法中最小的m 解法:二分查找 以n组中最小的数为左边界l,n组数据之和为右边界r进行二分查找,取中间值mid=(l+r)/2,mid即为k组数据中最大的一组数据和,若mid可将n组数据分成多于k组数据,则mid偏小取右间, 若可将n组数据分成小于k组数据,则mid偏小取左区间,若恰好可分成k组数据,因要取最小的

POJ3273 Monthly Expense —— 二分

题目链接:http://poj.org/problem?id=3273 Monthly Expense Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 29231   Accepted: 11104 Description Farmer John is an astounding accounting wizard and has realized he might run out of money to run the

poj3258——二分优化

poj3258——二分优化 River Hopscotch Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8201   Accepted: 3531 Description Every year the cows hold an event featuring a peculiar version of hopscotch that involves carefully jumping from rock to rock

POJ-3273 Monthly Expense---最小化最大值

题目链接: https://cn.vjudge.net/problem/POJ-3273 题目大意: 给N个数,划分为M个块(不得打乱数顺序).找到一个最好的划分方式,使得块的和的最大值 最小 解题思路: 首先是最大值最小 写出二分模板(需要确定上下界) 然后根据二分模板写chack函数 1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 typedef long long ll; 5 const int

二分 poj 3273

题目链接:https://vjudge.net/problem/POJ-3273 把n个连续的数字划分成m个连续的部分,每个部分都有一个部分和(这个部分所有值加起来),现在要使划分里最大的那个部分和最小. 我用的也是二分,用二分枚举最大的部分和. 代码: #include<iostream> #include<cstring> #include<algorithm> #include<queue> #include<map> #include&l

2.1 二分分类

本周学习神经网络编程的基础知识 构建神经网络,有些技巧是非常重要 神经网络的计算过程中,通常有一个正向的过程(正向传播步骤),接着会有一个反向步骤(反向传播步骤), 为什么神经网络的计算可以分为前向传播和反向传播两个分开的过程?本周课程通过使用logistic回归来阐述,以便于能够更好的理解, logistic回归是一个用于二分分类的算法 比如有一个二分分类问题的例子, 假如有一张图像作为输入是这样的,你想输出识别此图的标签,如果是猫,输出1,如果不是,则输出0 使用y来表示输出的结果标签, 来