题意理解:

dps、hp分别代表攻击力和血值。在回合制中,你与n个英雄战斗,己方hp无限,dps为1. 问击败所有英雄(hp=0),受到的最少dps和。

抽象出来就是,将敌方英雄排列起来,逐个击败,且受到的dps之和最小,典型的当前最佳问题,

分析

我先分析了三种情况,dps优先,hp优先,dps*hp优先,但是都不正确。 对此,我肯定要先解决总dps最大的,这里的dps最大应该是体现在整个序列上,即,若有两个英雄,后被解决的英雄的总dps是两个英雄的总hp乘其dps,我们要解决,一个英雄,当其放在后一个解决时,伤害更大。所以要先解决他。

所以之前的三种情况都不对,可以看出每个英雄的基本伤害是其dps和hp之积,我们要探究的是其放在后一位的情况下的伤害大小

思路:

使用结构体存每个英雄的dps和hp,再进行排序,排序的cmp是前者的dps与后者的hp之积,和前者二点hp与后者的dps之积进行比较,我们肯定解决更大的那个。再逐个累加,,hp也逐个累加。

#include<iostream>
#include<algorithm>
using namespace std;
typedef struct her {
	int dps;
	int hp;
}heros;
bool cmp(heros a, heros b) {
	return a.dps * b.hp > a.hp * b.dps;
}
int main() {
	int N;
	while (cin >> N) {
		heros hero[20];
		for (int i = 0; i < N; i++) {
			cin >> hero[i].dps >> hero[i].hp;
		}
		sort(hero, hero + N, cmp);
		int h=0,res=0;
		for (int i = 0; i < N; i++) {
			h += hero[i].hp;
			res += hero[i].dps * h;
		}
		cout << res << endl;
	}




	return 0;
}