Conceptos básicos de entrada codiciosos (problema de carga, número de intervalos, haffman (cola de prioridad))

Base de algoritmo codicioso (tipo súper básico)

El método codicioso es una estrategia para resolver problemas. Si es correcto, el método codicioso será fácil de describir e implementar.

Problema de carga

Dados n objetos, cada objeto tiene un volumen de mi y un precio unitario de pi. Hay una mochila con un volumen de m.
Pregunte cuántos son los más caros. (Suponiendo que el objeto se puede dividir).
Primero, necesitamos definir la estructura y una matriz de estructuras, y luego ordenar el precio unitario en orden descendente, cada vez que debemos seleccionar el objeto con el precio unitario más grande.

** Al igual que este ejemplo **

Se dijo que el Grupo Haidong enfrentó dificultades en los asuntos internos y externos, y que los veteranos de la compañía solo fueron abandonados por la pareja XHD. Obviamente, como hombre de negocios que lucha por muchos años, XHD no se quedará quieto.
Un día, cuando estaba pensando mucho y tratando de resolver sus problemas, de repente pensó en la herencia de su familia. Fue entonces cuando se fundó la compañía. Su padre le dio un regalo como regalo. El padre Xu explicó en ese momento que no debería abrirse hasta el último recurso. "¿No es el momento en que más lo necesito?" Mientras pensaba, XHD encontró este kit bien conservado y lo abrió. Solo había una frase: "Hay un tesoro en la Cueva Qianren en el pie norte de la ciudad de Hangzhou".
Sin decir una palabra, XHD tomó un gran bolsillo y partió. Sabía de esta cueva de mil hombres. Cuando era joven, su padre una vez lo llevó a esta intersección oculta y le dijo que se trataba de una cueva de mil hombres. Solo ahora entendía el significado de las palabras de su padre.
A pesar de la impresión, XHD gastó mucha energía para encontrar este agujero inusualmente escondido, entró y casi aturdido, ¡fue realmente deslumbrante! Sin embargo, aunque hay muchos tipos de bebés, la cantidad de cada tipo de bebé no es demasiado. Por supuesto, el precio del volumen unitario de cada bebé también es diferente. Para guardar la HDU, ayúdelo a calcular cuánto valor puede devolver XHD. Bebe (Suponiendo que el bebé se puede dividir, el valor después de la división es proporcional al volumen correspondiente)

La entrada de
entrada contiene varias instancias de prueba. La primera línea de cada instancia son dos enteros v y n (v, n <100), que indican respectivamente la capacidad de bolsillo y el tipo de bebé. Las siguientes n líneas contienen 2 enteros pi y mi (0 <pi, mi <10) representan respectivamente el precio unitario y el volumen correspondiente de un determinado bebé, y la entrada termina cuando v es 0.

Output
Para cada caso de prueba, la salida de un número máximo de valor XHD bebé puede ser recuperada, una fila para cada instancia de la salida.

Entrada de muestra
2 2
3 1
2 3
0

Salida de muestra
5

#include<iostream>
#include<algorithm>
using namespace std;
struct node {//物品结构体
	int pi;
	int mi;
}arr[110];
bool cmp(node a, node b) {
	return a.pi > b.pi;
}
int main() {
	int v, n;
	while (cin >> v) {
		if (v == 0)break;//结束输入
		else {
			cin >> n;
			for (int i = 0; i < n; i++) {
				cin >> arr[i].pi >> arr[i].mi;
			}int sum = 0;
			sort(arr, arr + n, cmp);//保证下面每一步都是最优解
			for (int i = 0; i < n; i++) {
				if (v > arr[i].mi) {//可以完全装下目前的商品
					sum = sum + arr[i].mi*arr[i].pi;
					v = v - arr[i].mi;
				}
				else {//这个物品需要分割
					sum = sum + arr[i].pi*v;
					break;//已经装满
				}
			}
			cout << sum << endl;
		}
	}
	return 0;
}

Enlace del título

Seleccionar intervalos disjuntos

Hay n intervalos abiertos en la recta numérica. El punto de partida es ai y el punto final es bi. Intente seleccionar varios intervalos para que los intervalos seleccionados no tengan puntos comunes.

Primero, suponga que hay dos intervalos n y m. Si estos dos intervalos,
n __________________
m _________
m está completamente dentro de n. En este momento, es obvio que elegir m es la mejor opción, porque no solo puede elegir un intervalo, sino que también puede ahorrar intervalo libre nm.

a 1 ___
...
b ____________ ... c ___________ En
este momento,
si el intervalo a y el intervalo b no se cruzan, entonces es aconsejable elegir el intervalo a. Si el intervalo a y el intervalo b se cruzan, entonces es aconsejable elegir el intervalo a.
Debido a que la parte anterior a 1 en el intervalo a no tiene efecto, solo la parte que es mayor que 1 tiene un efecto en la selección posterior, y esta parte influyente es significativamente menor que b. Por lo tanto, elija a.

Pregunta de ejemplo
Este verano no es AC HDU-2037
"¿No es este verano AC?"
"Sí". "
Entonces, ¿qué estás haciendo?"
"¡Mira el Mundial, idiota!"
"@ # $% ^ & *% ..."

De hecho, se acerca la Copa del Mundo y también se acerca el festival de los fanáticos. Se estima que muchos ACMers también abandonarán la computadora y correrán a la TV.
Como fanático, debe querer ver tantos juegos completos como sea posible. Por supuesto, como un buen joven en la nueva era, definitivamente verá otros programas, como la transmisión de noticias (nunca olvide preocuparse por los eventos nacionales), muy 6 + 7, super Girls, y el "Diccionario feliz" de Wang Xiaoya, etc., suponiendo que ya conozcan el horario de transmisión de todos los programas de televisión que les gusta ver, ¿harán arreglos razonables? (El objetivo es ver tantos programas completos como sea posible.)
Los
datos de entrada contienen múltiples instancias de prueba. La primera línea de cada instancia de prueba tiene solo un número entero n (n <= 100), que indica el número total de programas que desea ver, y luego n líneas de datos, cada línea incluye dos datos Ti_s, Ti_e (1 <= i <= n), que representan respectivamente el tiempo de inicio y finalización del i-ésimo programa, para simplificar el problema, cada vez está representado por un número entero positivo. n = 0 significa que la entrada ha terminado y no se realiza ningún procesamiento.
Salida
Para cada instancia de prueba, emite el número de programas de TV que se pueden ver por completo, y la salida de cada instancia de prueba ocupa una línea.
Entrada de muestra
12
1 3
3 4
0 7
3 8
15 19
15 20
10 15
8 18
6 12
5 10
4 14
2 9
0
Salida de muestra
5
enlace de tema

#include<iostream>
#include<algorithm>
using namespace std;
struct node{//节目
	int sx, ex;
}arr[110];
bool cmp(node a, node b) {
	return a.ex < b.ex;
}
int main() {
	int n;
	while (cin >> n) {
		if (n == 0)break;
		else {
			for (int i = 0; i < n; i++) {
				cin >> arr[i].sx >> arr[i].ex;
			}sort(arr, arr + n, cmp);//对结束时间进行排序
			int count = 1;//需要输出的答案
			int cur = arr[0].ex;//用来连接
			for (int j = 1; j < n; j++) {//第j个可不可以选择
				if (arr[j].sx >= cur) {//第j个可以选择
					cur = arr[j].ex;//更新
					count++;
				}
			}cout << count << endl;
		}
	}
	return 0;
}

Codificación Huffman

Descripción del problema El
  árbol Huffman tiene una amplia gama de aplicaciones en la codificación. Aquí, solo nos importa el proceso de construcción del árbol Huffman.
  Dada una lista de números {pi} = {p0, p1, ..., pn-1}, el proceso de construcción de un árbol Huffman con esta lista de números es el siguiente:
  1. Encuentra los dos números más pequeños en {pi}, establece en pa y pb, Elimine pa y pb de {pi}, luego agregue su suma a {pi}. El costo de este proceso se registra como pa + pb.
  2. Repita el paso 1 hasta que solo quede un número en {pi}.
  En el proceso de operación anterior, todos los costos se suman para obtener el costo total de la construcción del árbol Huffman.
  Tarea para este problema: para una secuencia dada, encuentre el costo total de construir un árbol Huffman con esa secuencia.

Por ejemplo, para la secuencia {pi} = {5, 3, 8, 2, 9}, el proceso de construcción del árbol Huffman es el siguiente:
  1. Encuentra los dos números más pequeños en {5, 3, 8, 2, 9}, que son 2 y 3, elimínelos de {pi} y agregue 5 para obtener {5, 8, 9, 5}, el costo es 5.
  2. Encuentre los dos números más pequeños en {5, 8, 9, 5}, 5 y 5, elimínelos de {pi} y agregue 10 para obtener {8, 9, 10}, el costo es 10 .
  3. Encuentre los dos números más pequeños en {8, 9, 10}, que son 8 y 9, elimínelos de {pi} y agregue 17 para obtener {10, 17}, el costo es 17.
  4. Encuentre los dos números más pequeños en {10, 17}, que son 10 y 17, elimínelos de {pi} y agregue 27 para obtener {27}, el costo es 27.
  5. Ahora, solo queda un número 27 en la secuencia. El proceso de construcción finaliza y el costo total es 5 + 10 + 17 + 27 = 59.
Formato de entrada
  La primera línea de entrada contiene un entero positivo n (n <= 100).
  A continuación se encuentran n enteros positivos, que representan p0, p1, ..., pn-1, cada número que no excede 1000.
Formato de
  salida Genere el costo total de construir el árbol Huffman usando estos números.
Entrada de muestra
5
5 3 8 2 9
Salida de muestra
59

#include<iostream>
#include<queue>
using namespace std;
int main() {
	priority_queue<int, vector<int>, greater<int > >q;//定义一个优先队列
	int n, s;
	cin >> n;
	while (n--) {
		cin >> s;
		q.push(s);
	}
	int a, b;
	int ans = 0;
	while(q.size()!=1){
		a = q.top();
		q.pop();
		b = q.top();
		q.pop();
		q.push(a + b);
		ans += a + b;
	}
	cout << ans<< endl;
	return 0;
}

... Se acabó ...

Publicó un artículo original · Me gustó 0 · Visitas 7

Supongo que te gusta

Origin blog.csdn.net/weixin_44605812/article/details/105632588
Recomendado
Clasificación