我们需要在她的手机中找到她最初必须拥有的最小值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)方法
答案 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;
}