Hero
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 2662 Accepted Submission(s): 1200
Problem Description
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.
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.
Input
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
Output one line for each test, indicates the minimum HP loss.
Sample Input
1 10 2 2 100 1 1 100
Sample Output
20 201
题意是:你的英雄血量HP是无限,但是你的伤害DPS是1;你可以选择对反复任何人一个英雄攻击,当对方的血量减少到0是就死了,同时对方其他人会同时攻击你,
且你掉血的量是对反复攻击力的总和,你攻击对方一次,对方的血量每次减少1。要求你消耗最少的血将敌人全部杀死。
所以,对反复伤害高,血量少的应该先杀死,即按 DPS/HP 从大到小排序。
这道题在写的时候有点坑!!
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct st
{
double DPS;
double HP;
}hero[50];
int cmp(st a,st b)
{
return a.DPS/a.HP>b.DPS/b.HP;//一开始这里写成return a.DPS/a.HP>b.DPS/b.HP?a.DPS/a.HP:b.DPS/b.HP<span style="font-family: Arial, Helvetica, sans-serif;">;居然ACCESS_VIOLATION,坑啊</span>
}
int main()
{
int n,i;
__int64 sum,total;
while(scanf("%d",&n)!=EOF)
{
sum=0;total=0;
for(i=0;i<n;i++)
{
scanf("%lf%lf",&hero[i].HP,&hero[i].DPS);//题上是先输入DPS,这里居然要先输入HP,好坑啊!!
total+=hero[i].DPS;
}
sort(hero,hero+n,cmp);
for(i=0;i<n;i++)
{
sum+=hero[i].HP*total;
total-=hero[i].DPS;
}
printf("%I64d\n",sum);
}
return 0;
}