类似排队打水问题;
定义每个怪物的性价比bi=怪物的攻击力/v11对怪物的击打次数。
对bi进行一次sort 从大到小,一次加和即可。
可以证明先消灭性价比小的 后消灭大的 会使损失值增大,对性价比相同的怎么处理都不影响结果。
代码:
要用longlong 。
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=10010;
typedef long long typec;
struct Monster{
typec hp,g,cnt;
double bi;
}m[maxn];
bool cmp (Monster a,Monster b)
{
return a.bi>b.bi;
}
int main ()
{
int cas;
scanf("%d",&cas);
for (int I=1 ; I<=cas ; ++I)
{
int n,atk;
scanf("%d%d",&n,&atk);
for (int i=0 ; i<n ; ++i)
{
scanf("%lld%lld",&m[i].hp,&m[i].g);
m[i].cnt=((m[i].hp+atk-1)/atk);
m[i].bi=(double)m[i].g/(double)m[i].cnt;
}
sort (m,m+n,cmp);
typec ans=0,cnt=0;
for (int i=0 ; i<n ;++i)
{
cnt+=m[i].cnt;
ans+=cnt*m[i].g;
}
printf("Case #%d: %lld\n",I,ans);
}
return 0;
}