H. Fight Against Monsters

题目链接

贪心求解,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;	
} 

猜你喜欢

转载自blog.csdn.net/weixin_40799464/article/details/83049100