雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

二分查找扩展——pku3273

Posted on 2011-08-29 16:40  huhuuu  阅读(231)  评论(0编辑  收藏  举报

题目要求如何将月份分组就可以 使月份中的最大值最小

二分查找

上届:sum(a[i])

下届:max(a[i])

while(l<=r)

{

  if(求的组别大于 题目要求)

    l=mid+1;

  else

    r=mid-1;

  ....统计 (随时记录符合条件的月份中的最大值 的最小值)

}

注意 count<=m时就可以更新,count<m时一定可以分成m组

View Code
#include<stdio.h>

int a[100009];
int rmax;

int zu(int max,int n)//可以分成几组
{
int i;
int add=1,t=0;
rmax
=0;
for(i=0;i<n;i++)
{
if((t+a[i])<=max)
{
t
+=a[i];

}
else
{
add
++;
t
=a[i];
}
if(t>rmax)
rmax
=t;
}
return add;
}

int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
int i,all=0,max=0;
for(i=0;i<n;i++)
{
scanf(
"%d",&a[i]);
if(max<a[i])
max
=a[i];

all
+=a[i];
}

int l=max,r=all,mid=(l+r)/2;
int count=zu(mid,n);
int min=999999999;
if(count<=m)
if(min>rmax)min=rmax;


while(l<=r)
{
if(count>m)
{
l
=mid+1;
}
else
{
r
=mid-1;
}

mid
=(l+r)/2;
count
=zu(mid,n);

if(count<=m)//分组小于要求时就可以更新
if(min>rmax)min=rmax;
}

printf(
"%d\n",min);
}
}