題目描述
問題描述
丑楓接到了一份奇葩的工作:往冰庫里搬運冰塊.冰庫外放着N箱冰塊,由於室外溫度高,冰塊會很快融化,且每箱冰塊的融化速度不同.因為每箱冰塊的體積,質量不等,把每箱冰塊搬運進冰塊花費的時間也不同.因此需要合理安排搬運順序,才能使總的冰塊融化量最小.丑楓請你幫忙計算最少的總融化量是多少,以便匯報上司.
輸入格式
第一行輸入整數N
接下來N行,每行兩個整數,分別表示每箱冰塊的搬運耗時Ti及融化速度Di.
輸出格式
輸出最少的總融化量
數據規模和約定
2<=N<=100000,1<=Ti<=4000000,1<=Di<=100
樣例輸入
6
6 1
4 5
4 3
6 2
8 1
2 6
樣例輸出
86
(貪心) $O(nlogn)$
思考過程:
使用微擾法,考慮兩個冰塊的,v1t1+v2(t1+t2)<=v2t2+v1(t1+t2)時融化量最小。
即v2t1<=v1t2即可。估按此排序后計算即可。
C++ 代碼
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N=100010;
struct Ice
{
int a;
long long sum;
}ice[N];
bool cmpsum(Ice q,Ice p)
{
if(q.sum*p.a < p.sum*q.a) return true;
else return false;
}
int main()
{
int n;
cin>>n;
long long m=0;
for(int i=0;i<n;i++)
{
int a,sum;
cin>>a>>sum;
ice[i].a=a;
ice[i].sum=sum;
}
sort(ice,ice+n,cmpsum);
for(int i=0;i<n;i++)
{
m+=ice[i].sum;
ice[i].sum=m;
}
long long res=0;
for(int i=n-1;i>=1;i--)
{
res+=ice[i].a*ice[i-1].sum;
}
cout<<res<<endl;
return 0;
}
