在移动设备中找到最低余额

时间:2015-05-10 08:47:57

标签: algorithm

爱丽丝有N个亲戚。她将与ith亲戚谈谈确切的T [i]分钟。每分钟花1美元。然而,她的亲戚在谈话之后,在她的手机中添加了X [i]美元的充值。最初,她在手机上有M美元余额。

我们需要在她的手机中找到她最初必须拥有的最小值M,以便在任何通话期间都不会失去平衡(遇到负余额)。

注意:Alice可以按任何顺序呼叫亲戚。每个亲戚只会被调用一次。

示例:设N = 2,并为两个亲属中的每一个配对T [i] X [i]如下:

1 1
2 1

然后这里的答案是2。

现在1≤N,X,T≤10^ 5。那么找到M. Brute解决方案的最小值的最佳方法是什么不能解决,所以我想要一些O(N)或O(N * logN)方法

1 个答案:

答案 0 :(得分:0)

我们维持通话费用之间的差异   和充值金额。

然后我们维护两个数组/向量。   如果我们的充值金额严格大于电话费,我们就把   第一个数组中的调用,否则我们将它放在第二个数组中。

然后我们可以根据成本和第二个数组对第一个数组进行排序   根据充值金额。然后我们通过添加来更新diff   我们的费用高于充值的电话充电量最少

然后我们可以迭代我们的第一个数组并更新我们的最大值   要求,每次通话的要求和当前的平衡。最后,我们的答案   将是最大要求与我们维持的差异之间的最大值。

示例: -

   N = 2
   T1 = 1 R1 = 1
   T2 = 2 R2 = 1

我们的第一个数组不包含任何内容,因为所有调用的成本都高于    或等于充值金额。所以,我们将两个调用放在第二个数组中    在对数组进行排序之前,diff会更新为2。然后,我们添加min    充电,我们可以从我们的差异调用(即1)得到。现在,差异是站立的    在3.然后,由于我们的第一个数组不包含任何元素,我们的答案等于    差异即3.

时间复杂度: - O(n)

工作示例: -

#include<bits/stdc++.h>
using namespace std;
#define MAXN 100007

int n,diff;
vector<pair<int,int> > v1,v2;

int main(){
    diff = 0;
    cin>>n;
    for(int i=0;i<n;i++){
    int cost,recharge;
    cin>>cost>>recharge;
    if(recharge > cost){
       v1.push_back(make_pair(cost,recharge));
    }else{
       v2.push_back(make_pair(recharge,cost));
    }
    diff += (cost-recharge);
   }
   sort(v1.begin(), v1.end());
   sort(v2.begin(), v2.end());
   if(v2.size() > 0)diff += v2[0].first;
   int max_req = diff, req = 0,cur = 0;
   for(int i=0; i<v1.size(); i++){
      req = v1[i].first - cur;
      max_req = max(max_req, req);
      cur += v1[i].second-v1[i].first;
   }
   cout<<max(max_req,diff)<<endl;
   return 0;
}