拼多多2018校招—小熊吃糖

题目

有n只小熊,他们有着各不相同的战斗力。每次他们吃糖时,会按照战斗力来排,战斗力高的小熊拥有优先选择权。前面的小熊吃饱了,后面的小熊才能吃。每只小熊有一个饥饿值,每次进食的时候,小熊们会选择最大的能填饱自己当前饥饿值的那颗糖来吃,可能吃完没饱会重复上述过程,但不会选择吃撑。

现在给出n只小熊的战斗力和饥饿值,并且给出m颗糖能填饱的饥饿值。

求所有小熊进食完之后,每只小熊剩余的饥饿值。

输入描述:

第一行两个正整数n和m,分别表示小熊数量和糖的数量。(n <= 10, m <= 100)
第二行m个正整数,每个表示着颗糖能填充的饥饿值。
接下来的n行,每行2个正整数,分别代表每只小熊的战斗力和当前饥饿值。
题目中所有输入的数值小于等于100。

输出描述:

输出n行,每行一个整数,代表每只小熊剩余的饥饿值。

输入例子1:

2 5
5 6 10 20 30
4 34
3 35

输出例子1:

4
0

例子说明1:

第一只小熊吃了第5颗糖
第二只小熊吃了第4颗糖
第二只小熊吃了第3颗糖
第二只小熊吃了第1颗糖

思路:

设计一个结构-熊,其包含战斗力、饥饿值和id。对其对象变量先按照战斗力从大到小进行排序。

对输入的糖的饥饿值排序。进行处理,处理完成后,按其id从大到小输出熊的剩余饥饿值。

#include<iostream>
#include<vector>
#include<algorithm>
struct bear
{
    int hungry;
    int power;
    int id;
};
bool cmp1(const bear &a,const bear &b)
{
        return a.power>b.power;
}
bool cmp2(const bear &a,const bear &b)
{
    return a.id<b.id;
}
using namespace std;
int main()
{
    int n,m;
    cin>>n>>m;
    vector<int>sugar(m);
    for(int i=0;i<m;i++)
        cin>>sugar[i];
    vector<bear>br(n);
    for(int i=0;i<n;i++)
    {
        cin>>br[i].power>>br[i].hungry;
        br[i].id=i;
    }
    sort(sugar.begin(),sugar.end());
    sort(br.begin(),br.end(),cmp1);
    for(int i=0;i<n;i++)
    {
        for(int j=m-1;j>=0;--j)
        {
            if(sugar[j]>0 && (sugar[j]<=br[i].hungry))
            {
                br[i].hungry-=sugar[j];
                sugar[j]=0;
            }
        }
    }
    sort(br.begin(),br.end(),cmp2);
    for(int i=0;i<n;i++)
        cout<<br[i].hungry<<endl;
    
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值