列表

详情


CMB20. 糖果分配

描述

假设你是一位很有爱的幼儿园老师,想要给幼儿园的小朋友们一些小糖果。但是,每个孩子最多只能给一块糖果。对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的糖果的最小尺寸;并且每块糖果 j ,都有一个尺寸 s。如果 sj >= g,我们可以将这个糖果 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。
注意:
你可以假设胃口值为正。
一个小朋友最多只能拥有一块糖果。

输入描述

第一行输入每个孩子的胃口值

第二行输入每个糖果的尺寸

孩子数和糖果数不超过1000

输出描述

能满足孩子数量的最大值

示例1

输入:

1 2 3
1 1

输出:

1

原站题解

C 解法, 执行用时: 1ms, 内存消耗: 476KB, 提交时间: 2020-05-20

#include <stdio.h>
 
int main()
{
    int i = 0;
    int j = 0;
    int min = 0;
    int index = 0;
    int num1 = 0;
    int num2 = 0;
    int a[1000];
    int b[1000];
    char c = 0;
     
    for (i = 0; i < 1000; i++)
    {
        scanf("%d%c", &a[i], &c);
        if ('\n' == c)
        {
            break;
        }
    }
    num1 = i + 1;
 
    for (i = 0; i < 1000; i++)
    {
        scanf("%d%c", &b[i], &c);
        if ('\n' == c)
        {
            break;
        }
    }
    num2 = i + 1;
 
    for (i = 0; i < num1; i++)
    {
        min = a[i];
        index = i;
        for (j = i + 1; j < num1; j++)
        {
            if (min > a[j])
            {
                min = a[j];
                index = j;
            }
        }
 
        if (i != index)
        {
            a[index] = a[i];
            a[i] = min;
        }
    }
    //printf("%d %d %d\n", a[0], a[1], a[2]);
     
    for (i = 0; i < num2; i++)
    {
        min = b[i];
        index = i;
        for (j = i + 1; j < num2; j++)
        {
            if (min > b[j])
            {
                min = b[j];
                index = j;
            }
        }
 
        if (i != index)
        {
            b[index] = b[i];
            b[i] = min;
        }
    }
    //printf("%d %d %d\n", b[0], b[1], b[2]);
 
    i = 0;
    j = 0;
    index = 0;
    while(i < num1 && j < num2)
    {
        if (b[j] >= a[i])
        {
            i++;
            index++;
        }
 
        j++;
    }
 
    printf("%d\n", index);
 
    return 0;
}

C++14 解法, 执行用时: 2ms, 内存消耗: 236KB, 提交时间: 2019-12-11

#include<stdio.h>
int main()
{
    int child[1000],candy[1000];
    int i,j;
    int m=0,n=0,temp=0,c=0,count=0;
    //输入胃口和糖果尺寸
    while(scanf("%d",&child[m]))
    {
        m++;
        if (getchar()=='\n')
            break;
    }
    while(scanf("%d",&candy[n]))
    {
        n++;
        if (getchar()=='\n')
            break;
    }
    //将胃口和糖果尺寸排序
    //胃口降序
    for (i=0;i<m-1;i++)
    {
        for (j=0;j<m-i-1;j++)
        {
            if (child[j]>child[j+1])
            {
                temp=child[j];
                child[j]=child[j+1];
                child[j+1]=temp;
            }
        }
    }
    //糖果降序
    for (i=0;i<n-1;i++)
    {
        for (j=0;j<n-i-1;j++)
        {
            if (candy[j]>candy[j+1])
            {
                temp=candy[j];
                candy[j]=candy[j+1];
                candy[j+1]=temp;
            }
        }
    }
    for (i=0;i<m;i++)
    {
        for(j=c;j<n;j++)
        {
            if (child[i]<=candy[j])
            {
                c=j+1;
                count++;
                break;
            }
        }
    }
    printf("%d",count);
}

上一题