这个题比较简单,不需要多说,最直观的解法就是二分,思路很清晰,写起来也方便。但仅满足于这个是不够的,看了别人的代码,好像有O(n) 的解法,后来想了一下,的确可以,所以说,一道题可以有不同的解法。而且我个人认为,每一种解法,都是一种思想。

二分代码:

#include<iostream>
#include<cstdio>
#include<vector>
#include<stack>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<set>
#include<map>

using namespace std;

const int N=1002;
long long c[N];
bool ok(long long k,vector<int> &m,vector<int> &e,vector<long long> &ec)
{
    for(unsigned int i=0;i<ec.size();++i)
    c[i]=ec[i];

    for(unsigned int i=0;i<m.size();++i)
    {
        long long tmp=k;
        for(unsigned int j=0;tmp>0&&j<e.size();++j)
        {
            if(e[j]<=m[i])
            {
                if(c[j]<=tmp)
                {
                    tmp-=c[j];
                    c[j]=0;
                }else
                {
                    c[j]-=tmp;
                    tmp=0;
                }
            }
        }
    }
    for(unsigned int i=0;i<ec.size();++i)
    if(c[i]>0)
    return false;
    return true;
}
class SpaceWarDiv1
{
    public:
    long long minimalFatigue(vector <int> m, vector <int> e, vector<long long> ec)
    {
        sort(m.begin(),m.end());
        int M1=0;
        for(unsigned int i=0;i<m.size();++i)
        M1=max(M1,m[i]);
        int M2=0;
        for(unsigned int i=0;i<e.size();++i)
        M2=max(M2,e[i]);
        if(M1<M2)
        return -1;
        long long l=0;
        long long r=0;
        for(unsigned int i=0;i<ec.size();++i)
        r+=ec[i];
        while(l<=r)
        {//cout<<l<<" "<<r<<endl;
            long long mid=(l+r)/2;
            if(ok(mid,m,e,ec))
            r=mid-1;
            else
            l=mid+1;
        }
        return l;
    }

};

  O(n)代码:

#include<iostream>
#include<cstdio>
#include<vector>
#include<stack>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<set>
#include<map>

using namespace std;

const int N=52;
struct node
{
    int e;
    long long ec;
}a[N];
bool cmp(node x,node y)
{
    return x.e<y.e;
}
class SpaceWarDiv1
{
    public:
    long long minimalFatigue(vector <int> m, vector <int> e, vector<long long> ec)
    {
        int len1=m.size();
        int len2=e.size();
        sort(m.begin(),m.end());
        long long sum=0;
        for(int i=0;i<len2;++i)
        {
            a[i].e=e[i];
            a[i].ec=ec[i];
            sum+=a[i].ec;
        }
        sort(a,a+len2,cmp);
        if(m[len1-1]<a[len2-1].ec)
        return -1;
        int l=0;
        long long M=0;
        for(int i=0;i<len1;++i)
        {
            long long tmp=(sum/(len1-i));
            if(sum%(len1-i)>0)
            ++tmp;
            M=max(M,tmp);
            while(l<len2&&m[i]>=a[l].e&&tmp>0)
            {
                if(a[l].ec>=tmp)
                {
                    sum-=tmp;
                    a[l].ec-=tmp;
                    tmp=0;
                }else
                {
                    tmp-=a[l].ec;
                    sum-=a[l].ec;
                    a[l].ec=0;
                }
                if(a[l].ec==0)
                ++l;
            }
        }
        return M;
    }

};

  

posted on 2013-06-15 20:16  夜->  阅读(224)  评论(0编辑  收藏  举报