题意 : 给出n个问题,每个问题有两个参数,一个ei(所要耗费的时间),一个ki(能得到的score)。每道问题需要耗费:(当前耗费的时间)*ki,问怎样组合问题的处理顺序可以使得耗费达到最少。
思路 : 如果有两个样例,e1=10,e2 = 20,k1 = 1 ,k2 = 3 ;
先解决第一个问题 : 10 * 1 + (10 + 20 ) * 3
先解决第二个问题 : 20 * 3 + (20 + 10) * 1
展开之后发现两个只有10 * 3 与 20 * 1是不同的。所以排序的时候看交叉相乘谁的小即可。

1 //HDU 4882 2 #include <cstdio> 3 #include <iostream> 4 #include <algorithm> 5 6 using namespace std ; 7 typedef __int64 LL ; 8 9 struct node 10 { 11 LL e ; 12 LL k ; 13 } p[100100]; 14 15 int cmp(struct node a,struct node b) 16 { 17 return a.e*b.k < a.k * b.e ; 18 } 19 int main() 20 { 21 int N ; 22 cin >> N ; 23 for(int i = 0 ; i < N ; i++) 24 cin >> p[i].e ; 25 for(int i = 0 ; i < N ; i++) 26 cin >> p[i].k ; 27 sort(p ,p + N ,cmp) ; 28 LL sum = 0,t = 0 ; 29 for(int i = 0 ; i < N ; i++) 30 { 31 t += p[i].e ; 32 sum += p[i].k*t ; 33 } 34 cout << sum << endl ; 35 return 0 ; 36 }