TopCoder SRM 582 SpaceWarDiv1

这个题比较简单,不需要多说,最直观的解法就是二分,思路很清晰,写起来也方便。但仅满足于这个是不够的,看了别人的代码,好像有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;

    }



};

  

你可能感兴趣的:(topcoder)