如何摆脱TLE?

时间:2016-11-05 15:42:26

标签: c++ algorithm

我用蛮力解决了以下challenge

  

鉴于N袋,每袋包含Ai巧克力。有一个孩子和一个   魔术师。在一个单位的时间里,孩子选择一个随机的包我,吃艾   巧克力,然后魔术师用地板填充第i个包(Ai / 2)   巧克力。

     

给出1< = i< = N的Ai,找到最大数量的巧克力   可以用K单位时间吃。

     

例如,

     

K = 3 N = 2 A = 6 5

     

回程:14

     

在t = 1时,孩子从袋子0中取出6个巧克力,然后袋子被填满   3个巧克力在t = 2时,孩子从袋子1和袋子里吃5个巧克力   被2个巧克力填满在t = 3时,孩子从0号袋里吃3个巧克力,   并且袋子被巧克力填充,所以巧克力的总数   吃了:6 + 5 + 3 = 14

     

注意:以10 ^ 9 + 7

的模式返回你的答案

首先,我将数组放在向量对中,第一个元素是值,第二个元素是索引。然后我从矢量中找到最大值并改变该值。

不幸的是,这需要太长时间 还有更好的方法吗?

int Solution::nchoc(int A, vector<int> &B) {
   vector<pair<int, int> >vc;

    for(int i=0; i<B.size(); i++)
    {
        vc.push_back(make_pair(B[i],i));
    }

    int sum=0;

    while(A>0)
    {
        pair<int,int> x=*max_element(vc.begin(),vc.end());

        int x1=x.first;
        vc[x.second].first= (int) vc[x.second].first/2;

        sum=((sum%1000000007)+(x1%1000000007))%1000000007;

        A--;
    }

    return sum;
}

1 个答案:

答案 0 :(得分:1)

您的算法的订单为O(N * K),因为您会检查每个步骤的每个行李。

相反,使用A i 的堆,并始终将top元素作为O(K * log N)的算法。

您希望来自<algorithm>push_heappop_heapmake_heap