I - Washing clothes

题意:

有n个人会在某时间段来洗衣服,但是只有一台洗衣机,当洗衣机被用时其他人只能手洗,手洗时间为y(题目给定),洗衣机的时间为x,x∈[1,y],问当x分别为[1,y]时,最短的洗衣时间是多少?

题解:

据我所知有两个方法:
1.李超树 2.贪心
李超树我还不是很清楚,等学会了再更新。。
贪心的话其实就是想办法优化,以为按照原题数据肯定是不可能暴力的,
根据题意:y肯定大于x
那我们就像最省时间的方法就是在y的时间内来洗衣机,因为一个人一旦手洗就不能再机洗,我们就看手洗时间等于多好啊机洗时间
记录最大数为pos,也就是从pos到最后一个人,这期间是小于一次手洗时间,也就是都可以手洗
然后i从n到pos枚举,记录机洗所花时间的最大值,并于第pos个人手洗时间进行对比
也就是从第pos人开始,是手洗时间更长还是机洗时间更长

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+9;
typedef long long ll;
ll t[maxn];

int main()
{
	ios::sync_with_stdio(false);
	ll n,y;
	while(cin>>n>>y)
	{
		
		ll sum=0;
		for(int i=1;i<=n;i++)
		{
			cin>>t[i];
		}
		sort(t+1,t+1+n);
		for(ll x=1;x<=y;x++)//洗衣机 
		{
			ll pos=0;
			for(ll j=n-1;j>=1;j--)//从后向前找人 
			{
				int times=(n-j+1); 
				if(y>1ll*x*times)continue;//当前人洗的时间等于多少洗衣机时间 
				else //当超过人洗时间,记录此时j 
				{
					pos=j;
					break;
				}
			}
			for(ll i=n;i>pos;i--)
			{
				
				sum=max(sum,1ll*(t[i]+x*(n-i+1)));//不同时间段人用洗衣机所花时间 
			}
			if(pos)sum=max(sum,1ll*(t[pos]+y));
			if(x!=y)
			cout<<sum<<" ";
			else cout<<sum<<endl;
		}
	}

}
posted @ 2020-09-30 23:33  回归梦想  阅读(105)  评论(0编辑  收藏  举报