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

时间:2021-08-31 23:00:41

题目链接

题意 : 给出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是不同的。所以排序的时候看交叉相乘谁的小即可。

 //HDU 4882
#include <cstdio>
#include <iostream>
#include <algorithm> using namespace std ;
typedef __int64 LL ; struct node
{
LL e ;
LL k ;
} p[]; int cmp(struct node a,struct node b)
{
return a.e*b.k < a.k * b.e ;
}
int main()
{
int N ;
cin >> N ;
for(int i = ; i < N ; i++)
cin >> p[i].e ;
for(int i = ; i < N ; i++)
cin >> p[i].k ;
sort(p ,p + N ,cmp) ;
LL sum = ,t = ;
for(int i = ; i < N ; i++)
{
t += p[i].e ;
sum += p[i].k*t ;
}
cout << sum << endl ;
return ;
}