Colorear la valla ------ codiciosos

Igor ha enamorado de Tanya. Ahora Igor quiere mostrar sus sentimientos y escribir un número en la valla frente a la casa de Tania. Igor cree que cuanto mayor sea el número, más posibilidades de ganar el corazón de Tanya que tiene.

Por desgracia, Igor podría conseguir solamente v litros de pintura. Él hizo los cálculos y concluyó que requiere dígitos d ad litros de pintura. Además, Igor oyó que Tanya no le gusta ceros. Es por eso que Igor no las van a utilizar en su número.

Ayuda Igor encontrar el número máximo que puede escribir en la valla.

Input
La primera línea contiene un número entero v positivo (0 ≤ v ≤ 106). La segunda línea contiene nueve números enteros positivos a1, a2, ..., a9 (1 ≤ ai ≤ 105).

Salida de
impresión, el número máximo de Igor puede escribir en la valla. Si él demasiado poco tiene pintura para cualquier dígito (así, no puede escribir cualquier cosa), imprimir -1.

Ejemplos
de entrada
5
5 4 3 2 1 2 3 4 5
de salida
55555

Input
2
9 11 1 12 5 8 9 10 6
de salida
33

Entrada
0
1 1 1 1 1 1 1 1 1
Output
-1

El significado de los problemas

Hay v litros de pintura, números 1-9 se dan la pintura de graffiti son necesarios, el número máximo de solicitud de escritura

Ideas de resolución de problemas

Después de leer una buena pregunta difícil, lo leyó varias veces para entenderlo, es evidente que el uso de pintura para encontrar el número más pequeño n para conseguir el máximo número máximo, y que el número resultante es el más grande, salida directa tiempos de Max N, pagados fuera de la wa y pensó por un momento no encontró circunstancias especiales en consideración, cuando el número mínimo no es divisible pintura está buscando, que hay restos de pintura, por el alto número es probable que sea mayor que n este tiempo; n en para encontrar el número de coincidencia entre 1-9.
la implementación del código

#include<iostream>
using namespace std;
int main()
{
	int v;
	int a[10];
	int min = 1000000;
	int t;
	cin >> v;
	for (int i = 1; i <= 9; i++)//最小数值
	{
		cin >> a[i];
		if (a[i] <= min)
		{
			min = a[i];
			t=i;
		}
	}
	if (v < min)//最小值大于v,无解
	{
		cout << "-1" << endl;
		return 0;
	}
	int max, k;
	max = v / min;  //最大位数
	k = v % min;//余数
	for (int i; k > 0 && max;) //使高位尽量大
	{   
		for (i = 9; i > t&& max; i--) 
		{
			if (k >= (a[i] - a[t])) 
			{
				cout<< i;
				max = max - 1;  
				k -= (a[i] - a[t]);
				break;
			}
		}
		if (i == t) break;
	}
	for (int i = 0; i < max; i++) 
		cout << t;
	return 0;
}
Publicado 26 artículos originales · alabanza ganado 30 · vistas 2418

Supongo que te gusta

Origin blog.csdn.net/SDAU_LGX/article/details/104931070
Recomendado
Clasificación