HDU4310HERO贪心问题

问题描述
When playing DotA with god-like rivals and pig-like team members, you have to face an embarrassing situation: All your teammates are killed, and you have to fight 1vN.

There are two key attributes for the heroes in the game, health point (HP) and damage per shot (DPS). Your hero has almost infinite HP, but only 1 DPS.

To simplify the problem, we assume the game is turn-based, but not real-time. In each round, you can choose one enemy hero to attack, and his HP will decrease by 1. While at the same time, all the lived enemy heroes will attack you, and your HP will decrease by the sum of their DPS. If one hero's HP fall equal to (or below) zero, he will die after this round, and cannot attack you in the following rounds.

Although your hero is undefeated, you want to choose best strategy to kill all the enemy heroes with minimum HP loss.
 

输入要求
The first line of each test case contains the number of enemy heroes N (1 <= N <= 20). Then N lines followed, each contains two integers DPSi and HPi, which are the DPS and HP for each hero. (1 <= DPSi, HPi <= 1000)
 

输出要求
Output one line for each test, indicates the minimum HP loss.
 
题目大意:
题目意思大概是:每个英雄有2个属性,HP血量和DPS单次平A伤害。而你是一个可以无限掉血还不会死的bug英雄QAQ,但是你的DPS只有1。而你的n个敌人血量有限制,DPS也不一样。你每次只能打一个英雄,问:当你杀完所有敌人,最少掉多少滴血?(虽然你玩的是无敌版游戏,但你还是要讲点技术的嘛)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4310

 贪思想: 
 
误区:先杀DPS大的enemy。
试想有敌人A:HP 1,DPS 100;敌人B:HP 100,DPS 1000;先杀A掉血:101100,先杀B掉血:110100。看吧,如果先把最吊的B干掉你反而掉更多的血。下面我讲讲一种正确的贪心思想:

一种正确贪心思想:先杀单位血量DPS高的enemy。即:先杀DPS/HP大的enemy

因为你的DPS为1,每次只能让敌人掉一滴血,你只有把这一滴血的伤害用在一滴血可以制造更高破坏的enemy身上。
然后你在攻击一个enemy时,其他enemy会攻击你。你要想想这个地方怎么处理,我提供一种思路,代码如下:

(第一次写博客,好不知所措啊,不知道讲清楚没有,望采纳,提建议)
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define N 25
#define eps 1e-8
using namespace std;
//用一个结构体来储存敌人的2个属性
typedef struct cw{
    int dps;
    int hp;
} sc;
sc enemy[N];
int cmp(sc x,sc y)
{
    return 1.0*x.dps/x.hp-1.0*y.dps/y.hp<eps;//比较浮点数大小会有误差
}
int main()
{
    int n;
    while(~scanf("%d",&n)){
        for(int i=0;i<n;i++){
            scanf("%d %d",&enemy[i].dps,&enemy[i].hp);
        }
        if(n==1)printf("%d\n",enemy[0].dps*enemy[0].hp);
        else {
            sort(enemy,enemy+n,cmp);//以单位血量DPS大小排序
            int sum=0;
            for(int i=n-1;i>=0;i--){
                //这是你杀一个enemy时受到的伤害
                sum+=enemy[i].dps*enemy[i].hp;
                for(int j=0;j<i;j++){
                    //这是其他enemy同时对你造成的伤害
                    sum+=enemy[j].dps*enemy[i].hp;
                }
            }
            printf("%d\n",sum);
        }
    }
    return 0;
}
 

 

posted @ 2017-11-23 23:43  Cwolf9  阅读(212)  评论(0编辑  收藏  举报