n个人用m个水龙头的接水问题 贪心

上次参加外校的校赛碰到的一道比较典型的贪心算法题。

题目大意是这样的:有n个人来接水,每个人的接水时间分别为t(i),现在一共有m个水龙头,问你n个人接水所需的最少时间。

我们首先可以想到m>=n和m=1这两种比较特殊的情况,对于m>=n的情况,每个人都可以单独用一个水龙头来接水,n个人无不影响,这时只需一个for循环,找出这n个人当中用时最长的那个人的接水时间输出即可;对于m=1的情况更简单,因为n个人都要接水,也就没有了先后之分,把n个人是接水时间加起来就行了;

那么接下来就是该问题的核心部分了,对于m

首先我们应该知道,要使接水的总时间最少,n个人当中用时最多的前m个人要分别占用不同的水龙头,这很好理解,因为m

#include 
#include 
#include 
#define MAX 1000
#define INF 999999999
using namespace std;
int t[MAX],s[MAX];
int n,m;
int cmp(const int &a,const int &b)
{
    return a>b;
}
int find_min()
{
    int pos,tmp=INF;
    for(int i=1;i<=m;i++)
      if(s[i]>n>>m)
    {
        int i,ans=0;
        for(i=1;i<=n;i++)
          cin>>t[i];
        if(m==1)
        {
            for(i=1;i<=n;i++)
              ans+=t[i];
        }
        else if(m>=n)
        {
            for(i=1;i<=n;i++)
              if(t[i]>ans)  ans=t[i];
        }
        else
        {
            sort(t+1,t+1+n,cmp);
            for(i=1;i<=m;i++)
              s[i]=t[i];
            for(;i<=n;i++)
              s[find_min()]+=t[i];
            for(i=1;i<=m;i++)
              if(s[i]>ans)  ans=s[i];
        }
        cout<

你可能感兴趣的:(贪心)