Los conceptos básicos del cepillado de algoritmos (1) - el conocimiento básico de los algoritmos

1. Responda a los requisitos de entrada del sitio web de cepillado de algoritmos

1. ¿Qué debo hacer si no sé cuándo terminará la entrada?

por ejemplo:

PAT 1002: Lea un entero positivo n , calcule la suma de sus dígitos y escriba cada dígito de la suma en pinyin chino.

No tiene idea de cuánto mide el entero positivo que ingresó, ¿qué debe hacer?

Hoichi: mientras… tipo EOF

while(scanf("%d",&n)!=EOF){
	……
}

El significado del código es: al leer el archivo, seguirá en bucle hasta que se lea el final del archivo. Lea repetidamente en n y ejecute el contenido del cuerpo del ciclo.

scanf es universal, ya sea una cadena (%s) o un número (%d).Si es solo una cadena, también puede usar gets() y getchar().

while(gets(str)!=NULL){
	……
}
char ch=getcahr();
while(ch!='\n'){
        ……
        ch=getchar();
    }

Significa que ingresa una cadena de caracteres en el área del búfer (presione la tecla Intro para indicar el final de la entrada), escribe ch=getchar() una vez, y ch tomará un carácter del área del búfer, siempre que se encuentra la marca final \n.

2. La estructura más simple para saber cuándo termina la entrada:

Por ejemplo, si el ciclo debe ejecutarse T veces, se puede escribir como:

while(T--){
	……
}

2. Introducción - Simulación de introducción

La simulación simple, la búsqueda de elementos y la salida gráfica son demasiado simples de explicar.

Hablemos del procesamiento de fechas, la conversión de bases y el procesamiento de cadenas.

Procesamiento de fechas: dadas dos fechas, ¿cómo encontrar la diferencia de días entre ellas?

Análisis de ideas : si sigue el pensamiento matemático general, considerará el año bisiesto, 31 días y 28 días en un año normal, etc. Si sigue el pensamiento de la computadora, ponga un contador, configure el acarreo, deje la fecha anterior continúe aumentando en uno, deténgase cuando sea igual a la siguiente fecha y registre El número de veces más uno es el número de días entre ellos.

Conversión de base : cómo se convierte un número base P en un número base Q. (P, Q<=10)

*Análisis de ideas: *Se divide en dos pasos, el primer paso es convertir el número de base P en un número decimal, y el segundo paso es convertir el número decimal en un número de base Q.

1. Convertir números base P a números decimales

Para un número decimal y=d1d2d3d4...dn, se puede escribir de esta forma:
wumiaosu

Para un número de base P y=d1d2d3d4...dn, se puede escribir de esta forma:
inserte la descripción de la imagen aquí

Y esta fórmula es fácil de implementar con un bucle:

int y=0,product=1;
while(x!=0){
	y=y+(x%10)*product;
	x/=10;
	product=product*P;
}

2. Convierte números decimales a números Q

Divide el código del resto de la base: convierte el decimal y en la base Q

int z[40],num=0;
do{
	z[num++] = y % Q;
	y = y / Q;
} while(y!=0)

Procesamiento de cadenas : lea una cadena de caracteres para determinar si se trata de un palíndromo.

Análisis de ideas : atravesar del subíndice 0 a len/2 (por ejemplo, 10 números, es bueno llegar a 4 y luego atravesar el subíndice a 01234, como 9 números, es bueno a 3, el subíndice transversal es 0123 , el medio 5 no se considera, y luego el último 6789 corresponde al frente).

Luego juzgue si str[i] y str[len-1-i] son ​​iguales.

Ordenar ideas importantes:

Tema: Una escuela primaria ha recibido recientemente un patrocinio y tiene la intención de utilizar parte de él para otorgar becas a los 5 mejores estudiantes con excelentes calificaciones. Al final del período, cada estudiante tiene tres materias: chino, matemáticas e inglés. *Si dos estudiantes tienen el mismo puntaje total, se clasificarán en orden descendente de idioma. Si el puntaje total y el idioma son iguales, el estudiante con el menor número de estudiantes se clasificará primero. *De acuerdo con los requisitos anteriores, programa para realizar su función.

Análisis de ideas: haga un buen uso de la función de clasificación en el archivo de encabezado del algoritmo, escriba una función cmp y use la declaración condicional en la función para satisfacer el significado de la pregunta.

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

struct score {
	int chinese;
	int math;
	int english;
	int num;
};
bool cmp(score x, score y) {//这招niubi
	if (x.chinese + x.math + x.english != y.chinese + y.math + y.english)
		return x.chinese + x.math + x.english > y.chinese + y.math + y.english;
	else {
		if (x.chinese != y.chinese) {
			return  x.chinese > y.chinese;
		}
		else
			return x.num < y.num;
	}
}

int main() {
	score a[1000];
	int N;
	cin >> N;//输入学生个数
	for (int i = 0; i < N; i++) {
		cin >> a[i].chinese >> a[i].math >> a[i].english;//按照语数英的顺序输入成绩
		a[i].num = i;
	}
	sort(a, a + N, cmp);
	for (int i = 0; i < N; i++) {
		cout << a[i].chinese << " " << a[i].math << " " << a[i].english << " " << a[i].num <<" " << a[i].chinese + a[i].math + a[i].english<<endl;
	}
	return 0;
}

Anillo de José:

Pregunta : [Descripción del problema] Hay n tarjetas, registradas como 1, 2, 3, ..., n (n<1000), ¿cómo se deben ordenar para que la primera tarjeta sea 1 y luego se coloquen las dos tarjetas? al final por turno; Abre la de arriba, que es exactamente 2, y luego pon las tres cartas al final por turno, y abre la de arriba, que es exactamente 3; y así sucesivamente, hasta que la última sea n.
[Ejemplo de entrada]
8
[Ejemplo de salida]
1 7 5 2 6 8 4 3
Análisis de pensamiento : observe el ejemplo de salida, coloque dos números sin asignar después de 1 y coloque 2, y luego vacíe tres números sin asignar después de Poner 3, luego ingrese el Joseph anillo (el resto del subíndice se puede utilizar para realizar el ciclo), luego vaciar los cuatro números no asignados y poner 4..., y así sucesivamente.

#include<iostream>
using namespace std;

int main() {
	int n; cin >> n; //n<1000
	int arr[1001] = { 0 };
	int pos = 0, count = 3;//pos指向放数的位置,count表示pos进入到下一个pos的步长,比如1在下标1的位置,2在下标4的位置
	for (int i = 0; i <n; i++) {
		arr[pos%n] = i+1;  //约瑟夫环的思想
		if (i == n-1) break;
		int j = 0;
		while (j!=count) {  //该循环意思为经过count个不为零的数。
			pos++;
			if (arr[pos%n] == 0) {
				j++;
			}
		}
		count++;
		
	}

	for (int i = 0; i <n; i++) {
		cout << arr[i] << "  ";
	}
	return 0;
}

Continuando con la actualización...

Supongo que te gusta

Origin blog.csdn.net/Dai_sir_man/article/details/120182597
Recomendado
Clasificación