列表

详情


NC25547. 晾衣服

描述

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

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

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

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

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



输入描述

第一行给出N,L
(1≤N≤2e5, 1≤L≤1e9)

接下来N行描述衣服,每行五个数字,分别代表湿度a,横放占晾衣架的长度b,横放每分钟减少的湿度c,竖放长度d,竖放每分钟减少的湿度e(b>d,c>e,1≤a,b,c,d,e≤1e9)

输出描述

输出一行一个整数代表答案。

示例1

输入:

2 10
100 10 100 1 1
10 3 5 2 3

输出:

100

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 403ms, 内存消耗: 4264K, 提交时间: 2020-02-26 12:36:13

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+11;
int a[maxn],b[maxn],c[maxn],d[maxn],e[maxn];
int LL=1,rr=1e9;
int n,l;
bool check(int x)
{
	ll sum=0;
	for(int i=0;i<n;i++)
	{
		if(1ll*e[i]*x>=a[i]) sum+=d[i];
		else if(1ll*c[i]*x>=a[i]) sum+=b[i];
		else return false;
	}
	return sum<=l;
}
int main()
{
	int t;
	cin>>n>>l;
	for(int i=0;i<n;i++)
	{
		cin>>a[i]>>b[i]>>c[i]>>d[i]>>e[i];
	}
	int ans=-1;
	while(LL<=rr)
	{
		int mid=(LL+rr)>>1;
		if(check(mid))
		{
			rr=mid-1;
			ans=mid;
		 } 
		 else LL=mid+1;
	}
	cout<<ans<<endl;
}

C++14(g++5.4) 解法, 执行用时: 138ms, 内存消耗: 9704K, 提交时间: 2019-05-11 21:31:31

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

const int N=2e5+5;
int a[N],b[N],c[N],d[N],e[N];
int n,l;
int ans=-1;
int ll=1,rr=1e9,mid;
bool check(){
	long long sum=0;
	for(int i=0;i<n;i++){
		if(1ll*e[i]*mid>=a[i]) sum+=d[i];
		else if(1ll*c[i]*mid>=a[i]) sum+=b[i];
		else return false;
	}
	return sum<=l;
}
int main()
{
	cin>>n>>l;
	for(int i=0;i<n;i++)
		scanf("%d%d%d%d%d",&a[i],&b[i],&c[i],&d[i],&e[i]);
	
	while(ll<=rr){
		mid=(ll+rr)>>1;
		if(check()){
			rr=mid-1;
			ans=mid;
		}
		else{
			ll=mid+1;
		}
	}
	printf("%d",ans);
	return 0;
}

上一题