2014多校第二场1011 || HDU 4882 ZCC Loves Codefires (贪心)

题目链接

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

 

你可能感兴趣的:(code)