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;
}
}
}