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 }
View Code

相关文章: