思路
对(int)(重量/空间)进行快排(从大到小)
如果平均值相等则按重量大的从大到小
然后一个一个加就行了
#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;
int Sum,Num,Ans,n,m;
int Flag[100025];
struct boat
{
int Space,Weight,Mean,Num;
//Space:空间||Weight:重量||Mean:平均值||Num:原来的序号
}Boat[100025];
bool Sorting(boat i,boat j)
{
return ((i.Mean>j.Mean) ||
((i.Mean==j.Mean) &&
(i.Weight>j.Weight)));
}//如果平均值相等则按重量大的从大到小
int main()
{
scanf("%d%d",&n,&Sum);
for(int i=1;i<=n;++i)
{
scanf("%d%d",&Boat[i].Space,&Boat[i].Weight);
Boat[i].Mean=(Boat[i].Space+Boat[i].Weight)/2;//平均值
Boat[i].Num=i;//原来的序号
}
sort(Boat+1,Boat+n+1,Sorting);
for(int i=1;i<=n;++i)
if(Sum>=Boat[i].Space)//空间还够
{
Ans+=Boat[i].Weight;//最大重量
Sum-=Boat[i].Space;//剩下空间
Flag[++Num]=Boat[i].Num;//记录
}
printf("%d\n",Ans);
// for(int i=1;i<=Num;++i)
// printf("%d ",Flag[i]);
// SSL不用输出后面的
return 0;
}