思路:题目要求任意选择n张卡组成一套卡组,卡组中每张卡牌的生命值之和乘与卡组中最小的魔法值。那么我们就按魔法值来对卡组排序(从大到小),这样我们就不用记录卡组的最小魔法值,用结构数组来记录数据,这样我们对魔法值排序的时保证里其所对应的生命值不变。(我们用sort函数排序,头文件为 algorithm,默认为从小到大排序),遍历结构数组,累加生命值并乘与当前魔法值,对比并记录最大伤害。
注意:数据类型应该用 long long
#include<iostream>
#include<algorithm>
using namespace std;
struct card{
long long hp;//生命值
long long mp;//魔法值
};
bool cmp(card s,card ss)
{
return(s.mp>ss.mp); //让结构数组按魔法值从大到小排序
}
int main()
{
int n,i,j;
cin>>n;
card s[n];//定义结构数组
for(i=0;i<n;i++)
{
cin>>s[i].hp>>s[i].mp;
}
sort(s,s+n,cmp);//让结构数组按魔法值从大到小排序
long long sum=0,max=0,hp=0;
for(i=0;i<n;i++)
{
hp+=s[i].hp;
sum = hp*s[i].mp;//伤害
if(sum>max)
{//比较并记录最大伤害
max = sum;
}
}
cout<<max;
return 0;
}