问题描述
丑枫接到了一份奇葩的工作:往冰库里搬运冰块.冰库外放着N箱冰块,由于室外温度高,冰块会很快融化,且每箱冰块的融化速度不同.因为每箱冰块的体积,质量不等,把每箱冰块搬运进冰块花费的时间也不同.因此需要合理安排搬运顺序,才能使总的冰块融化量最小.丑枫请你帮忙计算最少的总融化量是多少,以便汇报上司.
输入格式
第一行输入整数N
接下来N行,每行两个整数,分别表示每箱冰块的搬运耗时Ti及融化速度Di.
输出格式
输出最少的总融化量
样例输入
6
6 1
4 5
4 3
6 2
8 1
2 6
样例输出
86
提示:题目的意思是搬运时冰块不会融化;
题目分析:
贪心:局部最优达到全局最优
例如冰块1和冰块2,先搬1 还是2 看它们融化量,最小的先搬;
#include<bits/stdc++.h>
using namespace std;
bool cmp(const vector<int>& a,const vector<int>& b){
//先搬冰块a 时间a[1]*b[0],先b的话a[0]*b[1];
return a[0]*b[1]<a[1]*b[0];
}
int main(){
int n;
cin>>n;
vector<vector<int> > rs(n,vector<int>(2,0));
int xnum;
int ynum;
for(int i=0;i<n;i++){
scanf("%d %d",&xnum,&ynum);
rs[i][0]=xnum;
rs[i][1]=ynum;
}
sort(rs.begin(),rs.end(),cmp);
// for(int i=0;i<rs.size();i++){
// cout<<rs[i][0]<<' '<<rs[i][1]<<endl;
// }
long long sum=rs[0][0];
long long result=0;
for(int i=1;i<rs.size();i++){
result+=sum*rs[i][1];
sum+=rs[i][0];
}
cout<<result;
return 0;
}