更新: -
二進制搜索方法似乎導致了錯誤的結果(由用戶greybeard在下面的評論中提供的 測試用例作爲證明
所以,這是另一種方法。我們維持通話費用 與充值金額之間的差額
然後我們維護兩個數組/向量 如果我們的充值金額嚴格大於通話費用,我們將 第一個數組中的調用,否則我們把它放在第二個數組中。
然後我們可以根據成本和第二個數組 根據再充值量對第一個數組進行排序。然後,我們通過在呼叫中添加最少數量的再充值來更新差異,其中我們的成本高於充值
然後我們可以遍歷我們的第一個數組並更新我們的最大需求,每個呼叫的需求和當前餘額。最後,我們的回答 將是最大需求和我們維護的差異之間的最大值。
實施例: -
N = 2
T1 = 1 R1 = 1
T2 = 2 R2 = 1
我們的第一個數組包含毫無作爲所有的呼叫花費大於 或等於充電量。因此,我們將這兩個調用放在第二個數組中 在我們對數組進行排序之前,diff將更新爲2。然後,我們添加我們可以從我們的差異(即1)的調用中獲得的充值。現在,差異代表 在3。然後,因爲我們的第一個數組不包含元素,我們的答案等於 差異即3 。
時間複雜度: - O(nlogn)
工作實例: -
#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;
}
請提供downvote的原因。不要提供任何downvote原因downvote。 – Cyclotron3x3
沒有downvote,但問題應該是自我包含的。你需要在線程本身提供問題,而不僅僅是通過鏈接。另外,你沒有顯示你的嘗試。 – amit
而且,該鏈接在未註冊的情況下不可用,所以大多數讀者無論如何都看不到問題。 – amit