[CF767D] Cartons of milk

[CF767D] Cartons of milk - 二分

Description

Olya每天喝k瓶牛奶.她家里有n瓶牛奶,超市里有m瓶牛奶.每瓶牛奶有一个保质期,0表示当天,1表示第二天,以此类推.如果一瓶牛奶过了保质期,Olya要把它扔掉.为了不扔掉任何一瓶牛奶,求出她能够从商店里购买的最大牛奶的瓶数,并且按任意顺序输出购买的牛奶的编号(在输入顺序当中出现的位置).如果她连家里的牛奶都喝不完,输出-1.

Solution

二分出买多少瓶(显然会买保质期最长的),然后暴力检验即可

注意边界情况

#include <bits/stdc++.h>
using namespace std;

#define int long long

const int N = 1e6 + 5;

int n, m, k, a[N], b[N], id[N];

bool check(int pos)
{
    int p = 1, q = pos, t = 0;
    while (p <= n || q <= m)
    {
        int cnt = 0;
        while ((p <= n || q <= m) && cnt < k)
        {
            if (q > m || (p <= n && a[p] < b[q]))
            {
                if (a[p] < t)
                    return false;
                p++;
            }
            else
            {
                if (b[q] < t)
                    return false;
                q++;
            }
            cnt++;
        }
        ++t;
    }
    return true;
}

signed main()
{
    ios::sync_with_stdio(false);

    cin >> n >> m >> k;

    for (int i = 1; i <= n; i++)
        cin >> a[i];
    for (int i = 1; i <= m; i++)
        cin >> b[i];

    sort(a + 1, a + n + 1);

    vector<pair<int, int>> tvec;
    for (int i = 1; i <= m; i++)
        tvec.push_back({b[i], i});
    sort(tvec.begin(), tvec.end());
    for (int i = 1; i <= m; i++)
        tie(b[i], id[i]) = tvec[i - 1];

    int l = 1, r = m;
    while (l < r)
    {
        int mid = (l + r) / 2;
        if (check(mid))
            r = mid;
        else
            l = mid + 1;
    }
    if (check(l) == 0)
        ++l;
    if (check(l) == 0)
        ++l;
    if (l > m + 1)
        cout << -1 << endl;
    else
    {
        cout << m - l + 1 << endl;
        for (int i = l; i <= m; i++)
            cout << id[i] << " ";
        cout << endl;
    }
}
原文地址:https://www.cnblogs.com/mollnn/p/14663883.html