这是一个解法很简单,但是需要仔细考虑的问题。开始的时候可能会认为是攻击力越高越先处理。但是仔细考虑之后贪心点不仅仅由攻击力决定,还要它的生命值同时决定。勇士在攻击一个怪兽的同时别的怪兽也在攻击勇士,他们的伤害也在叠加。所以优先消灭的怪兽有两个因素同时的决定即有怪兽的攻击力和生命值的比值决定,攻击和生命值比值高的怪兽需要先处理掉。同时要注意此题的结果的取值范围。最终的结果需要使用long long型的数据。
#include<iostream>
#include<algorithm>
using namespace std;
struct monster_type{
int hp;
int ack;
};
struct monster_type monster[10002];
bool cmp_h_a(monster_type a,monster_type b){
return a.hp*b.ack<b.hp*a.ack;
}
//此处我们要的是
//注意数值的范围 选择变量的类型
int main()
{
int T;
scanf("%d",&T);
for(int p=1;p<=T;p++){
int n,m;//0<n<=10000 0<m<=100
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
scanf("%d%d",&monster[i].hp,&monster[i].ack);
monster[i].hp =(monster[i].hp+m-1)/m;
}
sort(monster,monster+n,cmp_h_a);
long long result=0;
int sum=0;
for(int i=0;i<n;i++)
{
sum+=monster[i].hp;
result+=(long long)sum*monster[i].ack;
//printf("sum=%d result=%d\n",sum,result);
}
printf("Case #%d: %lld\n",p,result);
}
return 0;
}