http://codeforces.com/contest/604/problem/B
题意:
给n个东西,每个的大小为a[i], 要求要用k个盒子装下所有东西, 每个盒子至多装2个东西,盒子装下东西的前提是。东西的大小之和不超过盒子的大小。
k个盒子的大小一致
求一个最小的盒子size。使得满足题目条件:k个min——size的盒子装下n个东西。
二分盒子的size,下界 a[n],上界 2e7 。
nlogn
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;
int tm[1000005];
int n,k;
int bin(int x)<span style="white-space:pre"> </span>//判断x个盒子能不能装下所有cowball
{
//if (x<n/2) return 0;
if (x<tm[n]) return 0;
int i=1;
int j=n;
int tmp=k;
while (tmp--)
{
int tmpx=x;
tmpx-=tm[j];
j--;
if (tmpx>=tm[i]) i++;
if (i>j) break;
}
if (i>j) return 1;
return 0;
}
int main()
{
int i;
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++)
{
scanf("%d",&tm[i]);
}
int l=tm[n];
int r=2e7;
int m;
int ans=-1;
while(l<=r)
{
if (r-l<=1)
{
if (bin(l))
ans=l;
else
ans=r;
break;
}
m=(l+r)>>1;
if (bin(m))
r=m;
else
l=m+1;
}
printf("%d\n",ans) ;
return 0;
}