zoukankan      html  css  js  c++  java
  • codeforces 557B. Pasha and Tea 解题报告

    题目链接:http://codeforces.com/problemset/problem/557/B

    题目意思:有 2n 个茶杯,规定第 i 个茶杯最多只能装 ai 毫升的水。现在给出 w 毫升的水,需要把这 w 毫升(可以不用光)的水倒入到这 2n 个茶杯中,使得分给 n 个男的每个水杯的水恰好是 n 个女的2倍(注意,n 个男的水杯装的水是一样的,n 个女也是)。现在问的是,怎样使得 2n 个杯装的水最多,求出这个值。

    *********************************************( 又开始误导他人成分,忽略之)

      假设倒入女孩的水杯的水为 x 毫升,我做的时候直接列出两个不等式,然后取较小值 * 3n(nx 是所有女的水杯的水,2nx 就是所有男的),于是就一直过不了pretest 8了。

       (1)2*x  ≤ 水杯最大容量(ai 最大值)

       (2)nx+ 2nx ≤ w (总不能超过 w 毫升的水吧)

      这样是错的啦。。。。首先(1)式就列得不对!试想,假设水杯编号为1~2n,由于前 n 小的水杯是分给女生的,这表明后 n 大的水杯是分给男生。但是男生最大只能取的水为 n+1 的容量,因为每只水杯的容量有限制嘛~~~~所以我们需要排序,找到第 n+1 位置大的水杯。我一开始还以为要用到二分做啦。。。。= =

    *********************************************

      正确思路是需要分情况讨论的!

      将ai 排完序之后我们需要取出a[1]和a[n+1] 来讨论。也就是最少水杯容量(x)和第 n+1 大水杯容量 y 。因为最优解就是将 x 分配给每个女生,y 分配给每个男生。

      注意,它们有可能构成 2 倍的关系,也可能不。所以很自然就要讨论啦。。。。2x 和 y 的大小关系!

      (1) 2x ≤ y    表示可以将 x 毫升的水分给女生,2x 分给男生,反正2x 肯定不大于 y

        总分配水量为:xn + 2xn = 3xn

      (2) 2x > y    此时我们只能把 y/2 毫升的水分给女生(没说一定要分足 x 毫升的水给女生嘛, y/2 肯定比 x 小,不等式自己移位看呗)

        总分配水量为: y/2 * n + y * n = 1.5 yn

      当然,我们怎么分,总不能超过给出的 w 毫升啦,这是大前提哦,所以最后要取较小值作为答案^_^

      

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 #include <cstring>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 const int maxn = 2e5 + 5;
     9 int a[maxn];
    10 
    11 int main()
    12 {
    13     #ifndef ONLINE_JUDGE
    14         freopen("in.txt", "r", stdin);
    15     #endif // ONLINE_JUDGE
    16 
    17     int n, w;
    18     while (scanf("%d%d", &n, &w) != EOF) {
    19 
    20         for (int i = 0; i < 2*n; i++) {
    21             scanf("%d", &a[i]);
    22         }
    23         sort(a, a+n+n);
    24         int maxv = a[n];
    25         int minv = a[0];
    26 
    27         double ans = 0.0;
    28         if (minv*2 > maxv) {
    29             ans =  (double)maxv * n * 1.5;  // maxv/2 * n + maxv * n;
    30         }
    31 
    32         else {
    33             ans = (double)minv * n * 3.0;
    34         }
    35         printf("%.9lf
    ", min((w*1.0), ans));
    36     }
    37     return 0;
    38 }
    View Code
  • 相关阅读:
    少走弯路 就要这样做数据分析
    少走弯路 就要这样做数据分析
    数据挖掘与CRM
    大数据精准营销的关键“三部曲”及核心“用户画像”
    大数据精准营销的关键“三部曲”及核心“用户画像”
    常见机器学习算法比较
    常见机器学习算法比较
    解决git clone时报错:The requested URL returned error: 401 Unauthorized while accessing
    机器学习技法之Aggregation方法总结:Blending、Learning(Bagging、AdaBoost、Decision Tree)及其aggregation of aggregation
    Java 实现选择排序
  • 原文地址:https://www.cnblogs.com/windysai/p/4617227.html
Copyright © 2011-2022 走看看