链接: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;
}