列表

详情


PDD9. 小熊吃糖

描述

有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

输出:

4
0

说明:

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

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 316KB, 提交时间: 2022-06-07

#include <stdio.h>

int cmpNum(const void *a, const void *b) {
    int *a1 = (int *)a;
    int *b1 = (int *)b;
    return (*b1 - *a1);
}

int main()
{
    int n, m;//小熊数量,糖的数量
    while (scanf("%d %d", &n, &m) != EOF) {
        int *m_num = (int *)malloc(sizeof(int) * m);
        for (int i = 0; i < m; i++) {//糖果饥饿值
            scanf("%d ", &m_num[i]);
        }
        int a[10][2] = {0};
        int tmp[10] = {0};
        //每只熊战斗力和饥饿值
        for (int i = 0; i < n; i++) {
            scanf("%d %d\n", &a[i][0], &a[i][1]);
            tmp[i] = a[i][0];
        }
        qsort(m_num, m, sizeof(int), cmpNum);
        qsort(a, n, sizeof(int) * 2, cmpNum);
       
        for (int j = 0; j < n; j++) {
             for (int i = 0; i < m; i++) {
                if (a[j][1] >= m_num[i]) {
                    a[j][1] -= m_num[i];
                    m_num[i] = 300;
                }
            }
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (a[j][0] == tmp[i]) {
                    printf("%d\n", a[j][1]);
                }
            }
        }
        free(m_num);
    }
    
    
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 368KB, 提交时间: 2019-02-16

#include <stdio.h>
#include <stdlib.h>
int swap(int *a,int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
    return 0;

}
int main()
{
    int bear,suger;
    int *suger_hunger;
    int (*battle)[2];
    int *odr;
    int i = 0,j = 0;

    scanf("%d%d",&bear,&suger);
    suger_hunger = (int *)malloc(sizeof(int)*suger);
    odr = (int *)malloc(sizeof(int)*bear);
    for(i = 0;i<bear;i++)
    {
        odr[i] = i;

    }
    for(i = 0;i<suger;i++)
    {
        scanf("%d",&suger_hunger[i]);

    }

    battle = (int(*)[2])malloc(sizeof(int)*2*bear);
    for(i = 0;i<bear;i++)
    {
        scanf("%d%d",&battle[i][0],&battle[i][1]);

    }
    for(i = 0;i<bear;i++)
    {
        for(j = 0;j<(bear - 1 -i);j++)
        {
            if(battle[odr[j]][0] <= battle[odr[j+1]][0])
            {
                swap(&odr[j],&odr[j+1]);

            }

        }

    }


    for(i = 0;i<suger;i++)
    {
        for(j = 0;j<(suger - i - 1);j++)
        {
            if(suger_hunger[j] < suger_hunger[j+1])
            {
                swap(&suger_hunger[j],&suger_hunger[j+1]);
            }

        }

    }

        for(i = 0;i<bear;i++)
        {
            for(j = 0;j < suger;j++)
            {
                if(battle[odr[i]][1] >= suger_hunger[j])
                {
                    if((battle[odr[i]][1] > 0)&&(suger_hunger[j] != 0))
                    {
                        battle[odr[i]][1] -= suger_hunger[j];
                        suger_hunger[j] = 0;

                    }

                }

            }

        }

                for(i = 0;i<bear;i++)
                {
                    printf("%d\n",battle[i][1]);

                }
                return 0;

}

C 解法, 执行用时: 2ms, 内存消耗: 372KB, 提交时间: 2020-11-23

#include <stdio.h>
int main()
{
    int n,m,a[11],b[11],max[11];
    scanf("%d %d",&n,&m);
    int su[100];
    for(int i=0;i<m;i++)
    {
        scanf("%d",&su[i]);
    }
    for(int i=1;i<=n;i++)
    {
        scanf("%d %d",&a[i],&b[i]);
        max[i]=i;
    }
    for(int i=1;i<=n;i++)
    {
      for(int j=1;j<=n-i;j++)
      {
        if(a[j]<a[j+1])
        {
            int temp;
            temp=a[j];
            a[j]=a[j+1];
            a[j+1]=temp;
            int temp2;
            temp2=max[j];
            max[j]=max[j+1];
            max[j+1]=temp2;
        }
      }
    }
   for(int i=0;i<m-1;i++)
   {
     for(int j=0;j<m-1-i;j++)
   {
       if(su[j]<su[j+1])
       {
           int temp;
           temp=su[j];
           su[j]=su[j+1];
           su[j+1]=temp;
       }
   }
   }
   for(int i=1;i<=n;i++)
   {
       for(int j=0;j<m;j++)
       {
           if(b[max[i]]-su[j]>=0)
           {
               b[max[i]]=b[max[i]]-su[j];
               su[j]=0;
           }
           
       }
   }

  for(int i=1;i<=n;i++)
   printf("%d\n",b[i]);

}

C 解法, 执行用时: 2ms, 内存消耗: 372KB, 提交时间: 2018-09-13

#include <stdio.h>
#include <stdlib.h>
int x[105];
typedef struct LHY
{
    int leng;
    int jie;
    int num;
}lhy;
lhy a[150];
int main()
{
    int n,m;
    int i,j;
    int swap;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(i=1;i<=m;i++)
            scanf("%d",&x[i]);
        for(i=1;i<=n;i++)
        {
            scanf("%d %d",&a[i].leng,&a[i].jie);
            a[i].num=i;
        }

        for(i=1;i<=n;i++)
        {
            for(j=i+1;j<=n;j++)
            {
                if(a[i].leng<a[j].leng)
                {
                    swap=a[i].leng;
                    a[i].leng=a[j].leng;
                    a[j].leng=swap;
                    swap=a[i].jie;
                    a[i].jie=a[j].jie;
                    a[j].jie=swap;
                    swap=a[i].num;
                    a[i].num=a[j].num;
                    a[j].num=swap;
                }
            }
        }
        int flag=1;
        int max=-1;
        int node;
        for(i=1;i<=n;i++)
        {
            flag=0;
            max=0;
            while(flag==0)
            {
                max=0;
                flag=1;
                for(j=1;j<=m;j++)
                {   
                   
                    if(x[j]!=0&&x[j]<=a[i].jie&&x[j]>max)
                    {
                        max=x[j];
                        node=j;
                        flag=0;
                    }
                }
                if(flag==0)
                {
                    a[i].jie=a[i].jie-max;
                    x[node]=0;
                }
                
            }
        }
        for(i=1;i<=n;i++)
        {
            for(j=i+1;j<=n;j++)
            {
                if(a[i].num>a[j].num)
                {
                    swap=a[i].leng;
                    a[i].leng=a[j].leng;
                    a[j].leng=swap;
                    swap=a[i].jie;
                    a[i].jie=a[j].jie;
                    a[j].jie=swap;
                    swap=a[i].num;
                    a[i].num=a[j].num;
                    a[j].num=swap;
                }
            }
        }
        for(i=1;i<=n;i++)
            printf("%d\n",a[i].jie);
    }
    return 0;
}

C++ 解法, 执行用时: 2ms, 内存消耗: 376KB, 提交时间: 2020-11-28

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct t {
    int first;
    int second;
    int xuhao;

};
bool com(t a, t b)
{
    if (a.first > b.first)
        return true;
    return false;
}
bool co(t a, t b)
{
    if (a.xuhao < b.xuhao)
        return true;
    return false;
}
int main()
{
    int n,m;
    while (cin >> n >> m)
    {
        vector<int> p(m);
        for (int i = 0; i < m; i++)
            cin >> p[i];
        sort(p.begin(), p.end());
        vector<t> tt(n);
        for (int i = 0; i < n; i++)
        {
            cin >> tt[i].first; 
            cin >> tt[i].second; 
            tt[i].xuhao = i;
            //cout << 1 << endl;
        }
        sort(tt.begin(), tt.end(),com);
        for (int i = 0; i < n; i++)
        {  
            bool flag = 1;
            while(tt[i].second>0)
            {
                flag = 0; int maxval = 0; int pos=0;
                for (int j = 0; j < p.size(); j++)
                {
                    if (p[j] > maxval && p[j] <= tt[i].second)
                    {
                        maxval = p[j]; pos = j; flag = 1;
                    }
                }
                if (flag)
                {
                    tt[i].second -= maxval;
                    maxval = 0;
                    p.erase(p.begin() + pos);
                }
                else
                    break;
            }
        }
        sort(tt.begin(),tt.end(), co);
        for (int i = 0; i < n; i++)
        {
            cout << tt[i].second << endl;
        }
    }
    return 0;
}

上一题