#include <iostream>
#include <algorithm>
using namespace std;
const int N=150;
int t[N];
struct x
{
int att;
int hungry;
int num;
};
x xiong[N];
bool cmp(x a,x b)
{
return a.att>b.att;
}
bool cmpr(x a,x b)//要定义两个排序函数,因为需要按照nun把熊在排回去,记得这个思想,很方便,不用使用map之类的东西
{
return a.num<b.num;
}
int main()
{
int n,m;cin>>n>>m;
for(int i=0;i<m;i++)
{
cin>>t[i];
}
for(int i=0;i<n;i++)
{
cin>>xiong[i].att>>xiong[i].hungry;
xiong[i].num=i;
}
sort(t, t+m);
sort(xiong, xiong+n,cmp);
for(int i=0;i<n;i++)
{
for(int j=m-1;j>-1;j--)
{
if(xiong[i].hungry>=t[j])
{
xiong[i].hungry-=t[j];
t[j]=300;
}
}
}
sort(xiong, xiong+n,cmpr);//注意这个地方
for(int i=0;i<n;i++)
{
cout<<xiong[i].hungry<<endl;
}
return 0;
} 思路:排序,贪心,模拟。
让熊和糖都排好序后,让战力最强的熊吃最大的那个糖,能吃的话就吃,不能吃的话就看下一个糖,每个熊都遍历一遍,最后注意要把熊再排序回去,因为要按原顺序返回熊的剩余饥饿值,因此要在定义熊的结构体时,重新加上num成员变量。因为这样可以通过num再把熊排序回去。

京公网安备 11010502036488号