题目:EPI
提示:
数组的元素为非负数。设数组元素的和为sum,则当S`>=0 且 S`<=sum时,肯定存在一个cap。
double F_function(vector<double> &num, vector<double> &sum, int k)
{
if (k == 0)
return num[k] * num.size();
double res = sum[k - 1] + num[k] * (num.size() - k);
return res;
}
double find_cap(vector<double> &num, double s)
{
if (num.empty() || s<0)
throw new exception("error");
if (num.size() == 1)
{
if (s <= num[0])
return s;
else
return -1;
}
sort(num.begin(), num.end());
vector<double> sum(num.size(), 0);//该数组第i个数,表示数组num中下标为0到i的数的和
double cursum = 0;
for (int i = 0; i < num.size(); i++)
{
cursum += num[i];
sum[i] = cursum;
}
int left = 0, right = num.size() - 1;
while (left < right)
{
if (left + 1 == right)
break;
int mid = left + (right - left) / 2;
double F = F_function(num, sum, mid);
if (F==s)//若相等
return num[mid];
else if (F > s)
right = mid;
else
left = mid;
}
//此时cap的范围在[num[left],num[right]]之间,其中left+1==right
//即有 F(cap)=sum[left]+cap*(num.size()-right)==s
double cap = (s - sum[left]) /(num.size() - right);
return cap;
}