题目链接

题意 : 给出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 }
View Code

 

posted on 2014-07-30 15:39  枫、  阅读(143)  评论(0编辑  收藏  举报