B题
给我们n,m , m表示茶壶的容量
接下来2*n个数字,表示茶杯的容量,将这些茶杯分给n个男孩和n个女孩
可以倒x毫升的茶水给每个女孩,那么就要倒2x毫升的茶水给男孩,当然了,茶杯要装的下,且茶壶的水足够多
问最多能倒多少毫升?
思路:将茶杯按容量从下到大排序,那么前n个茶杯一定分给女孩,后n个茶杯分给男孩。那么只要将第一个茶杯的容量作为上界,0作为下界,二分枚举x,
每次统计后n个茶杯的容量是不是>=2x,如果是,那么说明该容量是可行的。 但是最终的数据测试却错了, 因为精度要达到1e-11才能正确,不知道为什么
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <algorithm> 5 #include <iostream> 6 #include <queue> 7 #include <stack> 8 #include <vector> 9 #include <map> 10 #include <set> 11 #include <string> 12 #include <math.h> 13 using namespace std; 14 #pragma warning(disable:4996) 15 typedef long long LL; 16 const int INF = 1<<30; 17 const double eps = 1e-11; 18 /* 19 20 21 */ 22 int a[200000 + 10]; 23 int main() 24 { 25 int n, w; 26 while (scanf("%d%d", &n,&w) != EOF) 27 { 28 int m = 2 * n; 29 for (int i = 0; i < m; ++i) 30 { 31 scanf("%d", &a[i]); 32 } 33 sort(a, a + m); 34 double low = 0, high = a[0], mid; 35 int cnt; 36 double tmp; 37 while (high - low >= eps) 38 { 39 mid = (high + low) / 2; 40 cnt = 0; 41 for (int i = 0; i < m; ++i) 42 if (mid * 2 <= a[i]) 43 cnt++; 44 if (cnt >= n) 45 { 46 tmp = mid * 3 * n; 47 if (tmp<w) 48 high = mid; 49 else 50 low = mid; 51 } 52 else 53 high = mid; 54 } 55 printf("%f\n", mid * 3 * n); 56 57 } 58 return 0; 59 }