题目:
题解:
有N个敌方英雄,我方一个英雄,dps为1,hp无限,求消灭敌方所有英雄承受的最少伤害。
开一个结构体数组,struct hero{int dps;int hp;}a[105];
将元素按下列式子从小到大排序:
(((a.dps+b.dps)*a.hp+b.dps*b.hp) < ((a.dps+b.dps)*b.hp+a.hp*a.dps))
可得应先消灭哪个英雄,最后计算承受总伤害。
代码:
#include <stdio.h>
#include <algorithm>
#include <math.h>
using namespace std;
struct hero
{
int dps;
int hp;
}a[105];
bool cmp(hero a,hero b)
{
return (((a.dps+b.dps)*a.hp+b.dps*b.hp) < ((a.dps+b.dps)*b.hp+a.hp*a.dps));
}
int main()
{
int n;
while(~scanf("%d",&n)&&n)
{
int sum=0;
long long int loss;
loss=0;
for(int i=0;i<n;i++)
{
scanf("%d %d",&a[i].dps,&a[i].hp);
sum+=a[i].dps;
}
sort(a,a+n,cmp);
for(int i=0;i<n;i++)
{
loss+=a[i].hp*sum;
sum-=a[i].dps;
}
printf("%lld\n",loss);
}
return 0;
}