题意:
你的血无限,攻击力为1,有n个人攻击你,你要消耗最少的血量,杀掉所有人
最少的血量==敌人的攻击最小
//这个题其他部分都很好写,主要是cmp
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
struct node{
int hp;
int dps;
}enemy[10010];
bool cmp(node a,node b){
return (((a.dps+b.dps)*a.hp+b.dps*b.hp) < ((a.dps+b.dps)*b.hp+a.hp*a.dps));//特判条件是先杀a和先杀b所消耗的总血量进行比较
}
//int hits(int hi,int att){
// for(i=0;i<n;i++){
// for(j=0;j<enemy[i].hp;j++){
// attack += hit;
// }
// hit -= enemy[i].dps;
// }
//}
int main()
{
int attack=0,i,j,n,hit=0;
while(scanf("%d",&n)!=EOF){
for(i=0;i<n;i++)
{
scanf("%d%d",&enemy[i].hp,&enemy[i].dps);
}
sort(enemy,enemy+n,cmp);//贪心问题经典排序
for(i=0;i<n;i++){
hit += enemy[i].dps;//先是所有人的伤害叠加在一起
}
for(i=0;i<n;i++){
for(j=0;j<enemy[i].hp;j++){
attack += hit;
}
hit -= enemy[i].dps;//然后两个循环,第一次是所有的伤害*第一个人的血量,第二次剪去第一个人的伤害,然后依次循环
}
printf("%d\n",attack);
attack =0;
}
return 0;
}