#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再把熊排序回去。