贪心求解,a.atk/a.time值较大的排在前边。但是这样使用除法会导致精度损失,compare函数中的比较规则变为a.atk*b.time>b.atk*a.time就行了。当相等的时候按照atk的大小进行排序就行。
(原先的时候想按照a.atk/a.hp值较大的排在前边,想了一下是不行的。因为hp不同的怪兽攻击的次数可能是一样的。)
代码:
#include <iostream>
#include <algorithm>
using namespace std;
const int inf=1e5+7;
int cnt[2*inf];
struct node
{
int hp;
int atk;
int time;
}arr[inf];
bool compare(node a,node b)
{
if( a.atk*b.time ==b.atk *a.time )
return a.atk >b.atk ;
else
return a.atk*b.time > b.atk*a.time;
}
int main( )
{
int T,n;
int kk=1,k=0;
for(int i=1;i<=2*inf;i=i+(++kk))
{
while(++k<=i) // 7,8,9,10是四。
{
cnt[k]=kk; //其中的k应该是生命值。
}
k--;
}
/*
for(int i=0;i<=100;i++)
cout<<i<<" "<<cnt[i]<<endl;
*/
int kkk=0;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
int abc;
for(int i=0;i<n;i++)
{
scanf("%d %d",&arr[i].hp,&arr[i].atk);
arr[i].time =cnt[arr[i].hp];
}
sort(arr,arr+n,compare);
long long now=0;
for(int i=0;i<n;i++)
{
now+=arr[i].atk;
}
long long ans=0;
for(int i=0;i<n;i++)
{
ans+=( now * arr[i].time );
now-=arr[i].atk;
}
printf("Case #%d: %lld\n",++kkk,ans);
}
return 0;
}