题意:

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

}