原题链接:https://acm.bnu.edu.cn/v3/problem_show.php?pid=49673
题意:一壶茶w毫升,n个男,n个女,要求男生分到的茶都一样多;女生一样。但是每个男生分到的毫升是每个女生的两倍,求w的最大值。
分析:首先排序,分为两组,1–n,n+1–2*n,很容易知道前面是女生的,后面是男生的。设一个女生分到x毫升,则有n*x+n*(2*x)<=w,求得x<=w/(3*n)。最后二分[ 0 , min(x , a[ 1 ]) ]。
AC代码:
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
#include<stack>
#include<algorithm>
#include<cmath>
#include<string>
#include<stdio.h>
#define INF 1000000000
#define EPS 1e-6
using namespace std;
int n, w;
double a[200005];
int main()
{
while (~scanf("%d%d", &n, &w))
{
for (int i = 1; i <= 2 * n; i++)
scanf("%lf", &a[i]);
sort(a + 1, a + 1 + 2 * n);
double l = 0.0;
double r = min(a[1], (double)w / 3 * n);
while (r - l >= EPS)
{
double mid = (l + r) / 2;
if (mid * 2 < a[n + 1])
l = mid;
else if (mid * 2 > a[n + 1])
r = mid;
else
{
l = mid;
break;
}
}
printf("%lf\n", 3 * n* l);
}
return 0;
}