POJ 3273 :Monthly Expense【二分】

用力戳我直达virtual judge~

题意:有N个farm,每个farm花销farm[i]元。要求分成M块,尽可能让每个块花销少,求M个块中的最大值。(最大化最小值)

做法:二分结果(左界),每次判断mid能形成几个块,如果cur > M,说明钱必须更大,让块变少(low = mid + 1);否则满足条件,继续寻找更小的值。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

#include <iostream>

#include <algorithm>

#include <stdio.h>

#include <math.h>

#define scf1(a) scanf("%d",&a)

#define scf2(a,b) scanf("%d%d",&a,&b)

using namespace std;

int n, m;

int farm[100100];

bool judge(int mid){

    int sum = 0, cur = 1;            //cur初始化为1不是0啊!当满mid时 + 1

    for(int i = 0; i < n; i++){

        sum += farm[i];

        if(sum > mid){             //超过mid,cur + 1, 更新sum

            sum = farm[i];

            cur++;

        }

    }

    if(cur > m) return false;    //钱必须更大,让区域块变少  low = mid + 1

    else        return true;     //钱可以更小,让区域块变多  high = mid

}

int main(){

    scf2(n, m);

    int low = 0, high = 0;

    for(int i = 0; i < n; i++){

        scf1(farm[i]);

        low = max(low, farm[i]);

        high += farm[i];

    }

    while(low < high){

        int mid = (low + high) >> 1;

        if( judge(mid) ) high = mid;

        else low = mid + 1;

    }

    printf("%d\n",high);

}

时间: 2024-08-24 03:03:22

POJ 3273 :Monthly Expense【二分】的相关文章

POJ 3273 Monthly Expense 二分答案

Monthly Expense Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13281   Accepted: 5362 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 r

POJ 3273 Monthly Expense (二分枚举)

Monthly Expense Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 15822   Accepted: 6321 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 r

poj 3273 Monthly Expense 二分

题目链接:http://poj.org/problem?id=3273 因为规定天数连续 所以从前到后贪心即可 裸二分 二分专题的特点: 1.很容易写 2.很容易写错 所以要注意: 上下界的取值是否太大太小 加起来会不会爆 最后能不能跳出循环 当对中值进行判定以后 应该如何调整lb和ub 注意lb那个地方应该赋值为mid+1 否则会T到死 #include <cstdio> #include <cstdlib> #include <ctime> #include <

[ACM] POJ 3273 Monthly Expense (二分解决最小化最大值)

Monthly Expense Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14158   Accepted: 5697 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 r

二分搜索 POJ 3273 Monthly Expense

题目传送门 1 /* 2 题意:分成m个集合,使最大的集合值(求和)最小 3 二分搜索:二分集合大小,判断能否有m个集合. 4 */ 5 #include <cstdio> 6 #include <algorithm> 7 #include <cstring> 8 #include <cmath> 9 using namespace std; 10 11 const int MAXN = 1e5 + 10; 12 const int INF = 0x3f3f

POJ 3273 Monthly Expense(二分)

Monthly Expense Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 17465   Accepted: 6961 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 r

POJ 3273 Monthly Expense 【二分答案】

题意:给出n天的花费,需要将这n天的花费分成m组,使得每份的和尽量小,求出这个最小的和 看题目看了好久不懂题意,最后还是看了题解 二分答案,上界为这n天花费的总和,下界为这n天里面花费最多的那一天 如果mid>=m,说明mid偏小,l=mid+1, 如果mid<m,说明mid偏大,r=mid, 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath>

poj 3273 Monthly Expense

题目链接:http://poj.org/problem?id=3273 题目大意:给你n个数把他们连续的分成m组,问最小的那一组的最大值. 思路:用最小的那一个元素和总和进行二分...然后判断最小那组为mid时,分组的个数. #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <cmath> using namespace s

poj 3273 Monthly Expense(二分搜索之最大化最小值)

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

poj 3273 Monthly Expence 简单二分

1 /** 2 大意: 有连续的n天,每一天有一定的花费,将其分成m份,每一份占一天或者连续的几天,求这m份中的最大值 3 思路: 二分其最大上限,看在此最大上线,能分成多少份,若大于m份,说明上限过小,需要扩大上限 4 若小于m份,则说明,下限过大,需要缩小上限. 5 **/ 6 #include <iostream> 7 8 using namespace std; 9 int c[100010]; // 记录,每天的花费 10 int main() 11 { 12 int n,m; 13