sicily 2015. A New Year Gift

#include<iostream> //二分答案后贪心验证可行性
using namespace std;
int n,m,arr[1000];
bool verify(int c) //对组数c进行二分
{
int p=0;
for(int i=0;i<n;++i)
p
+=min(arr[i],c); //如果arr[i]<c,自然是加上arr[i];若arr[i]>=c,因为一共就c组,所以只能取c
if(p>=m*c) //c组,每组 m 条项链,返回1说明可以分成 c组
return 1;
return 0;
}
int main()
{
while(cin>>n&&n)
{
int sum=0;
for(int i=0;i<n;++i)
{
cin
>>arr[i];
sum
+=arr[i];
}
cin
>>m;
int s=0,t=sum/m,mid; //组数的上下界s,t
while(s<t-1)
{
mid
=(s+t)/2;
if(verify(mid))
s
=mid;
else
t
=mid-1;
}
if(verify(t))
cout
<<t<<endl;
else
cout
<<s<<endl;
}
return 0;
}

posted on 2011-07-05 02:21  sysu_mjc  阅读(203)  评论(0编辑  收藏  举报

导航