poj 3273 二分法变形——最大化最小值问题

该博客介绍了如何解决POJ 3273 Monthly Expense问题,这是一个关于花费数据划分的挑战。由于数据无序且要求区间连续,不能直接使用二分查找。作者分析了两种极端情况:M等于1时的最大值等于所有数据之和,M等于N时的最大值为数据中的最大值。文章探讨了解题思路和应对策略。
摘要由CSDN通过智能技术生成

题目传送门: POJ 3273 Monthly Expense

题目概述: 给出M个月的花费dataSet[i], 要求划分N段,要求每组花费值尽可能的小,最后输出当前情况下,花费值最大的一组的值。


解题思路:看到最大和最小两个词,就应该想到这种模板问题,但是这里有个坑,就是二分查找的必要条件之一就是有序,仔细查看题目给的数据确实是无序的,而且位置顺序都有对应关系,题目要求每个月的区间都是连续的,无法进行排序操作。

经过分析,我们可以得到两种极端情况:

  • 当M == 1的时候,我们只能取得一个分段,所以每个分组 == 整个分组 ,可以理解为区间的最大值end_flag == 当前数据之和
  • 当M == N的时候,我们把每个数据都分为一个区间,所以可以理解为区间的最小值就是 当前数组中的最大值 ,即start_flag == 数组中的最大值
所以题目的答案一定会在[start_flag = max_value , end_flag=sum_value]这个区间内部,这样的话,我们开始进行先关的查找,即满足M的情况下,进行区间的范围搜索,最后的middle_value一定是满足上述要求的唯一的结果


#include<iostream>
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
int N,M;
int dataSet[100000];

bool pd_section (int middle_value){
    int cnt, sum;
    cnt = 1;
    sum = 0;
    for (int i=0; i<N; i++){
        sum +=  dataSet[i];
        if (sum > middle_value ){
            cnt++;
            sum = dataSet[i];
        }
        if (cnt > M){
            return false;
        }
    }
    return true;
}

int main ()
{
    while (cin>>N>>M)
    {
        int max_value = 0;
        int sum_value = 0;
        for (int i=0;i<N;i++){
            cin>>dataSet[i];
            sum_value += dataSet[i];
            max_value = max(max_value, dataSet[i]);
        }
        int start_flag, end_flag;
        start_flag = max_value;
        end_flag = sum_value;
        int middle_value;
        while (start_flag <= end_flag){
            middle_value = (start_flag + end_flag) / 2;
            if ( pd_section(middle_value) ){
                end_flag = middle_value - 1;
            } else {
                start_flag = middle_value + 1;
            }
        }
        cout<<middle_value<<endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值