Codiciosos algoritmo - notas algoritmo

algoritmo voraz

algoritmo voraz: sólo tienen en cuenta la solución óptima local, de modo que el resultado global del método para lograr la solución óptima. Es decir, la mitad de cada paso de la estrategia es la solución óptima, por lo que la mayoría de alcance global o superiores resultados.

PAT 1020 torta de la luna (25 puntos)

Los chinos comen pastel de luna se encuentra en el Festival de Medio Otoño un alimento tradicional, las diferentes regiones tienen muchos sabores diferentes de pastel de luna. Ahora dado todo tipo de inventario de pastel de luna, precio total, y la máxima demanda del mercado, se puede obtener el máximo beneficio calculado la cantidad.

Nota: Permitir la eliminación de una parte de la venta de acciones. Ejemplos de casos dado es la siguiente: Si tenemos tres tipos de pastel de luna, sus acciones estaban 18,15,10 toneladas, el precio total, respectivamente 75,72,45 mil millones. Si la demanda de mercado máxima es de sólo 20 millones de toneladas, entonces deberíamos ser la estrategia de ingresos máximos para vender la totalidad de las 150.000 toneladas de los dos tipos de pastel de luna, así como 50.000 toneladas de los tres tipos de pastel de luna, obtenemos 72 + 45/2 = 94,5 (millones) .

Formatos de entrada:

Cada entrada comprende una prueba. Cada caso de prueba se da a un número entero positivo de no más de 1.000 N representa el número de tipos de pastel de luna, y no más de 500 (en unidades de miles de toneladas) del entero positivo d representa la máxima demanda de mercado. Entonces da N º fila representa un número positivo de las existencias de cada torta de la luna (en unidades de miles de toneladas); N última línea da número positivo indica un precio de venta total de cada torta de la luna (en unidades de mil millones). Entre números separados por un espacio.

Los formatos de salida:

Para cada prueba, el máximo beneficio en la línea de salida, en unidades de mil millones y con precisión a dos cifras decimales.

de entrada de la muestra:

3 20
18 15 10
75 72 45

 

Resultado de muestra:

94.50

Respuesta:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

struct moon{
    double number,totalprice,singleprice;//库存,总价,单价
};

bool cmp(moon a,moon b){
    return a.singleprice>b.singleprice;
};

int main(){
    int n,d;
    cin>>n>>d;
    vector<moon> v(n);
    for(int i = 0;i<n;i++){
        cin>>v[i].number;
    }
    for(int i = 0;i<n;i++){
        cin>>v[i].totalprice;
        v[i].singleprice = v[i].totalprice/v[i].number;
    }
    sort(v.begin(),v.end(),cmp);
  

    double result=0.0;
    for(int i = 0;i<n;i++){
        if(v[i].number<=d) result =result + v[i].totalprice;
        else{
            result = result + v[i].singleprice*d;
            break;
        } 
        d = d - v[i].number;
    }
    printf("%.2f",result);
    return 0;
}

PAT 1023 establece un número mínimo (20 minutos)

0-9 cada Dado un número. Puede organizar estos números en cualquier orden, pero debe ser utilizado en su totalidad. El objetivo es hacer que el número resultante lo más pequeño posible (no hace prestar atención a la primera 0). Por ejemplo: Dados dos 0, 1 dos, tres 5, un 8, obtenemos el número mínimo es de 10.015.558.

El número mínimo ahora se le da un número, por favor, la salida del programa de escritura puede estar compuesto.

Formatos de entrada:

De entrada 10 se le da un número entero no negativo en una fila, tenemos la secuencia representa el número 0, el número de número 1, número 9 ....... Separadas por un espacio entre número entero. El número total de 10 dígitos no más de 50 es, y tiene al menos un dígito distinto de cero.

Los formatos de salida:

El número más pequeño en una fila puede ser de la misma salida.

de entrada de la muestra:

2 2 0 0 0 3 0 0 1 0

 

Resultado de muestra:

10015558

Respuesta:

 

#include <iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;

int main() {
	vector<int> a(10);
	for(int i = 0;i<10;i++){
		cin>>a[i];
	}
	int n;
	for(int i = 1;i<10;i++){
		if(a[i]!=0){
			n = i;
			a[i] = a[i] - 1;
			break;	
		}
	}
	cout<<n;
	for(int i = 0;i<10;i++){
		for(int j = 0;j<a[i];j++){
			cout<<i;
		}
	}
	return 0;
}


//二刷
#include<iostream>
using namespace std;

int main(){
    int count[10];//记录数字0~9的个数
    for(int i = 0;i<10;i++){
        scanf("%d",&count[i]);
    }
    for(int i =1;i<10;i++){
        if(count[i]>0){
            printf("%d",i);
            count[i]--;
            break;
        }
    }
    for(int i =0;i<10;i++){
        for(int j = 0;j<count[i];j++){
            printf("%d",i);
        }
    }
    return 0;
}

 

 

Publicado 98 artículos originales · ganado elogios 2 · Vistas 3699

Supongo que te gusta

Origin blog.csdn.net/qq_30377869/article/details/105027732
Recomendado
Clasificación