蒜头君在玩一种卡牌游戏,他有 n 张卡牌,每张卡牌上写着两个正整数 ai,bi ,ai 表示这张卡牌的能量值,bi表示这张卡牌的魔法值。
蒜头君要从这 n张卡牌中选出一些形成一个卡组,用这个卡组对敌人造成伤害。一个卡组对敌人的伤害是这个卡组中所有卡牌的能量值之和乘其中魔法值最小的一张卡牌的魔法值。
蒜头君想知道他用一个卡组最多能对敌人产生多少伤害。
输入格式
第一行,一个正整数 n(1≤n≤10的5次方)。
接下来 n行,每行两个正整数 ai,bi(1≤ai,bi≤10的6次方)
输出格式
输出一行,包含一个整数,表示蒜头君用一个卡组对敌人产生的伤害的最大值。
数据范围
对于 70%的数据,1≤n≤10的3次方,1≤ai,bi≤10的3次方
对于 100%的数据,1≤n≤10的5次方,1≤ai,bi≤10的6次方
Sample Input
3
1 2
3 4
5 6
Sample Output
32
我一开始用的是二维数组,但是超时了,于是求助大佬学习了结构,写下来这道题,要想办法知道最大值,就得把魔法值排序,然后能量值可以相加并且乘以魔法值,以此来求最大值。感谢我韬哥带飞。最后附上代码。
#include<iostream>
#include<algorithm>
using namespace std;
struct game{//定义结构数组,可以比二维数组快很多
long long int energy,magic;//定义能量和魔法值
};
bool cmp(game g,game gg)
{
return (g.magic>gg.magic);//使结构数组可以从大到小排序
}
int main()
{
long long int n,m,max=0,energy=0,i,sum=0;
cin>>n;
game g[n];//创建结构数组
for(i=0;i<n;i++)
{
cin>>g[i].energy>>g[i].magic;
}
sort(g,g+n,cmp);//从大到小排序(bool cmp)
for(i=0;i<n;i++)
{
energy+=g[i].energy;//能量值可以叠加
sum=energy*g[i].magic;//因为魔法从大到小排序
//所以每次乘的都是当前最小魔法值
if(max<sum)
{
max=sum;//更新最大值
}
}
cout<<max<<endl;
return 0;
}