題目描述
給定 n 個整數對(ai, bi) , 每個整數對的價值是(i-1)*ai + (n-i)*bi (下標從1開始, 這裡的 ai 、bi 和輸入不一定對應),然後問所有整數對的最小價值總和。
輸入輸入包含多組測試用例。
對於每組測試用例,首先輸入數對的數量n(n<=1e5)
接下來輸入n對數對 ai bi (0<=ai,bi<=1e9)
輸出對於每組測試用例,輸出這些整數對的最小價值總和。
樣例輸入
3
3 22 4
6 1
樣例輸出
11
提示
0 * 6 + 2 * 1 + 1 * 3 + 1 * 2 + 2 * 2 + 0 * 4 = 11
首先我們來看兩對數之間價值的大小關係:設pair1(a1, b1), pair2(a2, b2),兩個位置i,j(假定i < j)。
pair1位於位置i,pair2位於位置j:(i - 1) * a1 + (n - i) * b1 + (j - 1) * a2 + (n - j) * b2 ①
pair2位於位置i,pair1位於位置j:(i - 1) * a2 + (n - i) * b2 + (j - 1) * a1 + (n - j) * b1 ②
① - ②:(j - i)(b1 + a2 - a1 - b2)
若① < ②:b1 + a2 < a1 + b2 即:a1 - b1 > a2 - b2
反之則:a2 - b2 > a1 - b1
由此可見,只有兩對數的時候,差越大的放在前面,總的價值和越小。
所以我們可以按照數對差的大小,對其進行排序,差大的放在前面,小的放在後面,即可得到最小價值和。如果這不是最小價值,那麼一定有另一種排列方式,我們將其還原為從大到小的順序,會得到乙個更小的價值和。由此證明從大到小的順序是最小價值和的排列。方便說明,舉個例子,假設三個數對的差分別為6,3,1.如果我們假設1,3,6的價值和最小,我們對其進行還原:
1 3 3 6
3 -> 1 (相比原來總價值和更小) -> 6 (同理) -> 3 (同理,此時再改變某一對的順序只會令價值和更大)
6 6 1 1
**如下:
#includeusing namespace std;
const int n = 1e5 + 1;
struct pair;
bool cmp(const pair &p1, const pair &p2)
int main()
cout << weight << endl;
} return 0;
}
Scrum of Scrums 問題和價值
mike cohn 敏捷估計與規劃 一書的作者 認為,scrum of scrums sos 會議 是把scrum擴充套件到大型專案團隊的一件利器。這些會議可以讓多個團隊討論他們的工作,尤其關注工作重疊和整合的領域。allan shalloway正在寫一本新書 lean software devel...
IPTV SDN的概念和價值
經過30多年發展,ip網路從最初滿足簡單internet服務的網路,其應用領域也逐步向社會生活的各個方面滲透,並影響和改變人們的生產和生活方式。隨著網際網路業務的發展,網路也面臨一系列問題 裝置日趨複雜。ip技術使用 打補丁 式的演進策略 目前ietf發布的rfc標準超過7000個 使得裝置的功能和...
使用者價值和RFM模型
什麼是使用者價值?使用者價值就是對公司來說有用的地方,比如有的公司看中使用者的消費能力,有的公司則看中使用者的忠誠度 各公司的業務目的不同,使用者價值的體現自然也不同。這裡主要說一下適用於電商的rfm模型。什麼是rfm模型?rfm模型根據使用者最近一次消費時間r,消費頻率f,消費金額m,計算出rfm...