Comercio de FatMouse

Descripción del problema
FatMouse preparó M libras de comida para gatos, lista para intercambiar con los gatos que protegen el almacén que contiene su comida favorita, JavaBean.
El almacén tiene N habitaciones. La i-ésima habitación contiene J [i] libras de JavaBeans y requiere F [i ] libras de comida para gatos. FatMouse no tiene que cambiar por todos los JavaBeans de la habitación, sino que puede obtener J [i] * a% libras de JavaBeans si paga F [i] * a% libras de comida para gatos. Aquí hay un número real. Ahora te está asignando esta tarea: dile la cantidad máxima de JavaBeans que puede obtener. Comida favorita JavaBean. El almacén tiene N habitaciones. La primera habitación tiene J libras de granos de café y necesita F libras de comida para gatos. FatMouse no tiene que intercambiar todos los granos de café de la habitación, por el contrario, si paga F [i] * un% de libra de comida para gatos, puede obtener J [i] *% de libra de café . a continuación, las habas a es un número real Ahora se ha asignado esta tarea para usted:.. le dice la cantidad máxima de los granos de café se puede obtener)
de entrada
La entrada consta de varios casos de prueba. Cada caso de prueba comienza con una línea que contiene dos números enteros no negativos M y N. Luego siguen N líneas, cada una contiene dos números enteros no negativos J [i] y F [i] respectivamente. El último El caso de prueba va seguido de dos -1. Todos los números enteros no son mayores que 1000.
(La entrada consta de varios casos de prueba. Cada caso de prueba comienza con una línea que contiene dos números enteros no negativos M y N, y luego N líneas, cada línea Contiene dos enteros no negativos J [i] y F [i]. El último caso de prueba va seguido de dos 1. Todos los enteros no son mayores que 1000.)
Salida
Para cada caso de prueba, imprima en una sola línea un número real con una precisión de hasta 3 lugares decimales, que es la cantidad máxima de JavaBeans que FatMouse puede obtener. (Para cada caso de prueba, imprima un número real con una precisión de 3 lugares decimales en una línea, que es la cantidad máxima de granos de café que FatMouse puede obtener ..)

Código

#include <stdio.h>
#include <stdlib.h>
#define MAX 1000
struct food{
    
    
    int j,f;  || 定义j表示咖啡豆,f表示猫粮。
    double p;  || p表示咖啡豆和猫粮的比例,用双精度更精确。
}food_N[1001];  || 定义个数组表示房间数。
 
int main(void)
{
    
    
    int m,n,i;  || 定义m表示胖鼠有点猫粮数量,n表示总的房间数,i表示房间号。
    while(scanf("%d%d",&m,&n) && (m!=-1 || n!=-1))
    {
    
    
        double sum=0.0;  || 最开始胖鼠是0个咖啡豆。
        struct food temp; 
        for( i=0;i<n;i++)   || 从房间号为0开始循环探索,每次加一。
        {
    
    
            scanf("%d%d",&food_N[i].j,&food_N[i].f);  || 输入j,f 。这里表示第i个房间有j个咖啡豆,且需要f个猫粮兑换。
            food_N[i].p=(double)food_N[i].j/food_N[i].f;  || 第i个房间咖啡豆和需要兑换猫粮的比例。
        }
        for(i=0;i<n;i++)
        {
    
    
            for(int k=i;k<n;k++)  || 定义一个k,k的出现打破了现在的咖啡豆和猫粮比例的排序
            {
    
    
                if(food_N[i].p<food_N[k].p) 
                {
    
    
                    temp=food_N[i];
                    food_N[i]=food_N[k];
                    food_N[k]=temp;  ||这里采用了一个换数的方法更改了排序,也就是冒泡排序。
                }
            }
        }
        for(int i=0;i<n;i++)  
        {
    
    
            if(m>food_N[i].f)  || 在探索到一个房间时,若胖鼠手上的猫粮大于该房间需要兑换的猫粮数。
            {
    
    
                sum+=food_N[i].j;  || 则直接交换。
                m-=food_N[i].f;   || 然后减去兑换的数量。
            }
            else
            {
    
    
                sum+=food_N[i].p*m;  || 若是不够,则按比例兑换。
                break;
            }
        }
        printf("%.3lf\n",sum);
    }
    return 0;
}

Idea
1. Dado que cada habitación contiene el precio que debe pagar el ratón, es necesario encontrar la proporción más grande de granos de café por comida para gatos para intercambiar, de modo que pueda obtener más comida para gatos, por lo que debe explorar cada habitación. Luego ordene la relación de mayor a menor, si el precio final no es suficiente para obtener todos los granos de café de la habitación, los granos de café correspondientes al precio se obtienen proporcionalmente.

Nota
1. temp no es una palabra clave del lenguaje C, ni es una función o palabra de comando. Es solo una variable ordinaria definida por el usuario. Por supuesto, el usuario puede definir el tipo de datos a voluntad.
2. Los algoritmos codiciosos siempre hacen la mejor elección en la vista actual. Es decir, el algoritmo codicioso no considera la optimalidad general, la elección que hace es solo una opción óptima local en cierto sentido. Por supuesto, espero que el resultado final obtenido por el algoritmo codicioso sea también el mejor en general. Aunque el algoritmo codicioso no puede obtener la solución óptima general para todos los problemas, puede producir la solución óptima general para muchos problemas.

Supongo que te gusta

Origin blog.csdn.net/weixin_54501632/article/details/114682986
Recomendado
Clasificación