zoukankan      html  css  js  c++  java
  • 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;
        }
    
    };
    

      

  • 相关阅读:
    13.Odoo产品分析 (二) – 商业板块(6) –采购(3)
    9.Odoo产品分析 (二) – 商业板块(4) –讨论(1)
    10.Odoo产品分析 (二) – 商业板块(5) –日历(1)
    8.Odoo产品分析 (二) – 商业板块(3) –CRM(2)
    7.Odoo产品分析 (二) – 商业板块(3) –CRM(1)
    the nearest point/vertex point of linestring
    Clojure的引用类型:var,ref,agent和atom
    clojure的delay future promise
    clojure的语法糖
    postgres select TOP X in group 查询每个组的前几名
  • 原文地址:https://www.cnblogs.com/liulangye/p/3137961.html
Copyright © 2011-2022 走看看