C-晾衣服

链接:https://ac.nowcoder.com/acm/contest/892/C

题意:

鸡尾酒从杭州回来,囤积了许多衣服,洗好之后,他发现晾衣服是一件麻烦的事。

晾衣绳的长度只有L,而鸡尾酒有N件衣服,每件衣服挂在衣架上之后可以横着晾或者竖着晾,横着晾比较占晾衣绳的地方,但是受光面积大,干得也快,竖着晾反之。

鸡尾酒每天都要专心卖萌,没时间管这些衣服,所以在挂好每件衣服之后就不会再调整,他只希望能最快的看到所有衣服全部被晾干。

请你帮鸡尾酒算算,假如他以最优决策挂衣服,最早经过多长时间,所有衣服都能被晾干。

如果他永远无法一次性晾干所有衣服,输出-1。

思路:

贪心没贪出来,赛后看是二分。

直接二分答案。

统计长度要用到longlong

代码:

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

typedef long long LL;
const int MAXN = 2e5+10;
const int INF = 1e9;

struct Node
{
    int time, hlen, ht, slen, st;
    int nht, nst;
    void Init()
    {
        nht = (time+ht-1)/ht;
        nst = (time+st-1)/st;
    }
}node[MAXN];
int n, sum;

bool Check(int time)
{
    LL need = 0;
    for (int i = 1;i <= n;i++)
    {
        if (node[i].nst <= time && node[i].nht <= time)
            need += min(node[i].slen, node[i].hlen);
        else if (node[i].nst <= time)
            need += node[i].slen;
        else if (node[i].nht <= time)
            need += node[i].hlen;
        else
            return false;
    }
    if (need <= sum)
        return true;
    return false;
}

int main()
{
    scanf("%d%d", &n, &sum);
    LL lesslen = 0;
    for (int i = 1;i <= n;i++)
    {
        scanf("%d%d%d%d%d", &node[i].time, &node[i].hlen, &node[i].ht, &node[i].slen, &node[i].st);
        lesslen += min(node[i].slen, node[i].hlen);
        node[i].Init();
    }
    if (lesslen > sum)
    {
        cout << -1 << endl;
        return 0;
    }
    int l = 1, r = 1e9;
    int res;
    while (l <= r)
    {
        int mid = (l+r)/2;
        if (Check(mid))
        {
            res = mid;
            r = mid-1;
        }
        else
        {
            l = mid+1;
        }
    }
    cout << res << endl;

    return 0;
}

  

posted @ 2019-05-12 10:22  YDDDD  阅读(275)  评论(0编辑  收藏  举报