zoukankan      html  css  js  c++  java
  • [ICPC2016上海D] Ice Cream Tower

    [ICPC2016上海D] Ice Cream Tower - 二分

    Description

    给你n个冰淇淋球,告诉你每个冰淇淋球的体积,你可以将若干个冰淇淋球堆成一个塔,需要满足的条件是当前冰淇淋球的体积至少是在它上面的那个球的体积的两倍,一个塔至少有k层,即一个塔至少由k个冰淇淋组成,问最多可以堆成多少个塔。

    Solution

    二分最终能堆成多少个塔,然后贪心检验即可

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    
    int caseid = 0;
    
    bool check(int mid, int k, const vector<int> &a)
    {
        if (mid <= 0)
            return true;
        int cnt = 0;
        int n = a.size();
        vector<int> b(mid);
        int p = 0;
        for (int i = 0; i < n; i++)
        {
            int x = a[i];
            if (x >= 2 * b[p])
            {
                b[p] = x;
                p = (p + 1) % mid;
                if (p == 0)
                    ++cnt;
            }
        }
        return cnt >= k;
    }
    
    signed main()
    {
        ios::sync_with_stdio(false);
        int t;
        cin >> t;
        while (t--)
        {
    
            ++caseid;
            int n, k;
            cin >> n >> k;
    
            vector<int> a(n);
            for (int i = 0; i < n; i++)
                cin >> a[i];
    
            sort(a.begin(), a.end());
    
            int l = 0, r = n / k + 1;
            while (l < r)
            {
                int mid = (l + r) / 2;
                if (check(mid, k, a))
                    l = mid + 1;
                else
                    r = mid;
            }
    
            l++;
            for (int i = 0; i < 3; i++)
                if (check(l, k, a) == 0)
                    --l;
    
            cout << "Case #" << caseid << ": ";
            cout << l << endl;
        }
    }
    
  • 相关阅读:
    常用Git代码托管服务分享
    .NET中操作IPicture、IPictureDisp
    Git学习笔记与IntelliJ IDEA整合
    螺旋队列问题
    杂题3道
    .NET 配置文件简单使用
    C++之Effective STL
    不容易理解的 lock 和 merge
    状态模式
    观察者模式
  • 原文地址:https://www.cnblogs.com/mollnn/p/14667807.html
Copyright © 2011-2022 走看看