poj 3273二分最小化最大值+贪心算组数,判断细节!

贪心判断和之前最大化最小值的题目思路类似,只不过需要小心分组数;

二分(注意这是最大值最小化而不是最小值最大化)

1.注意判断函数最后return的条件和主函数二分的通用写法!不然莫名WA很难受。

2.注意先算出上下界

#include <iostream>

#include<stdio.h>
#include<algorithm>
using namespace std;
int L,M,N;
int a[5000010];




bool Judge(int s)//最小和 
{

int i=0;
int zu=1;
int temp=0;
for(int i=0;i<N;i++)
{
if(temp+a[i]<=s)//划分组关键是组头划还是组尾划,此处从组头开始判断 
{

temp+=a[i];

}
else
{
temp=a[i];

zu++;


}


}
// cout<<s<<"?"<<cu<<endl;
if(zu>M)//不能加等于号,会WA,意义千差万别
return true;
else        //要特判等号的情况→ 就算等于,还想找更小的 ,所以往左找
return false;
}


int main()
{


cin>>N>>M;
int max2=0;
int sum1=0;
for(int i=0;i<N;i++)
{
scanf("%d",&a[i]);
sum1+=a[i];
max2=max(a[i],max2);
}




int l=max2;
int r=sum1;//上下界必须确定好

int mid;
while(l<=r) //这里条件写法很多种
{
mid=(l+r)/2;
if(Judge(mid))
l=mid+1;//换了种写法,这种写法适用性强
else
r=mid-1;
}
cout<<l<<endl;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值