杭电ACM——4310,Hero(贪心)

题意:有N个敌人,每个敌人都有血条HP和伤害DPS,你的HP无限,伤害固定为1,而且你在攻击敌人的同时,所有HP不为0的敌人都能攻击你。求出击杀所有敌人所需的最小HP损失。
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4310

分析:此题跟Protecting The Flowers很相似,用类似的算法解决。

伪代码如下:
输入n
sum=s=0;
for(i=0;i<=n-1;i++)
{
scanf("%lf%lf",&d[i],&h[i]); //d[i]为伤害,h[i]为血条
v[i]=h[i]/d[i]; //v[i]为衡量哪个敌人先杀的权值,小的先杀,大的后杀,同flowers那道题一样
s+=d[i];
}
sort(n); //选择排序即可
for(i=0;i<=n-1;i++)
{
sum+=s*h[i];
s-=d[i];
}
输出sum;

代码如下:

#include<cstdio>
using namespace std;
double h[25],d[25],v[25];
void sort(int n)
{
	int i,j,k;
	for(i=0;i<=n-2;i++)
	{
		k=i;
		for(j=i+1;j<=n-1;j++)
		{
			if(v[k]>v[j]) k=j;
		}
		if(k!=i)
		{
			double t;
			t=v[i],v[i]=v[k];v[k]=t;
			t=h[i];h[i]=h[k];h[k]=t;
			t=d[i];d[i]=d[k];d[k]=t;
		}
//		printf("%.2lf %.2lf %.2lf\n",d[i],h[i],v[i]);
	}
}
int main()
{
	int n,i;
	long long sum,s;
	while(~scanf("%d",&n))
	{
		sum=s=0;
		for(i=0;i<=n-1;i++)
		{
			scanf("%lf %lf",&d[i],&h[i]);
			v[i]=h[i]/d[i];
			s+=d[i];
		}
		sort(n);
		for(i=0;i<=n-1;i++)
		{
			sum+=s*h[i];
			s-=d[i];
		}
		printf("%lld\n",sum);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/shamansi99/article/details/87906823