当前位置: 代码迷 >> 综合 >> 二分经典 POJ 3273(最大值的最小化)
  详细解决方案

二分经典 POJ 3273(最大值的最小化)

热度:21   发布时间:2024-01-15 08:41:38.0

         POJ 3273

题目描述:

? 给定一个数列,要求把数列切分成m个段,使得总和最大的一段的总和最小。求这个总和。

算法分析:

二分查找经典例子,总体思路就是我们先假设mid就是我们要找到答案,看它符不符合题目所给要求(分列成m段,最小),

具体细节看代码。

代码实现:

#include <bits/stdc++.h>
using namespace std;int main()
{int n,m,a[100005],maxx=-1,sum=0,i,j;cin>>n>>m;for(i=1;i<=n;i++){cin>>a[i];sum+=a[i];    //记录右边界if(maxx<a[i])maxx=a[i];//记录又边界}int l=maxx,r=sum,mid;int cnt;while(l<=r){sum=0;       //记录划分段的累加和cnt=0;        //记录划分的段数mid=(l+r)/2;for(i=1;i<=n;i++){sum+=a[i];if(sum>mid){cnt++;sum=0;   //不要忘记清0i--;    //不要加这个数,保证sum不大于midcontinue;}}cnt++;//加上最后一段,因为最后一段不在上循环记录if(cnt>m)  //说明分多了,mid偏小l=mid+1;elser=mid-1;}cout<<l;return 0;
}