我用蛮力解决了以下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;
}
答案 0 :(得分:1)
您的算法的订单为O(N * K),因为您会检查每个步骤的每个行李。
相反,使用A i 的堆,并始终将top元素作为O(K * log N)的算法。
您希望来自<algorithm>
的push_heap
,pop_heap
和make_heap
。