Ejercicio 1-Recurrencia, etc.

1000 Problema A

Límite de tiempo: 40/20 MS (Java / Otros) | Límite de memoria: 65536/32768 KB (Java / Otros)

Envíos: 110 | Resuelto: 24

Descripción del Título

Dado un conjunto de valores desordenados, el tamaño del valor está entre 1 y un millón y el número de valores está entre 100.000 y 500.000. Ahora necesitas encontrar el número entero más pequeño del quinto al décimo.

Requisitos de entrada

Un grupo de enteros distintos de cero, (número> = 10), 0 es el signo final.

Requisitos de salida

El quinto al décimo entero más pequeño. Cada salida envuelve un entero.

Muestra de entrada

1
2
3
4
5
6
7
8
9
10
0

Salida de muestra

5
6
7
8
9
10

// An highlighted block
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
    
    
	int a[5000];
	int i=0;
	int x;
	while(cin>>x){
    
    
		if(x==0) break;
		a[i++]=x;

	}
	sort(a,a+i-2);
	for(i=4;i<10;i++){
    
    
		cout <<a[i]<<endl;
	}
	return 0;
}

1001 Problema B

Límite de tiempo: 2000/1000 MS (Java / Otros) | Límite de memoria: 65536/32768 KB (Java / Otros)

Envíos: 55 | Resuelto: 7

Descripción del Título

Para una pasarela con 2 filas y N columnas. Ahora usa 1 2 o 2 2 ladrillos para llenarlo. Pregunte de cuántas formas diferentes (utilice la recursividad para resolver). Si N es grande, se requiere un cálculo de alta precisión. La siguiente imagen es un cierto método de pavimentación de una pasarela con 2 filas y 17 columnas:

Inserte la descripción de la imagen aquí

Requisitos de entrada

Un número entero N, N <= 1000.

Requisitos de salida

¿Cuántos métodos hay en total?

Muestra de entrada

30

Salida de muestra

715827883

análisis

1 La suma de números enteros grandes utiliza una cuerda
2 El problema de la colocación de ladrillos:
la situación considerada al colocar ladrillos es aproximadamente la misma, por lo que se puede resolver por recursividad. Según el número de columnas restantes, dividimos esta pregunta en dos situaciones:

R: Queda la última columna, así que suponga que después de eliminar esta columna, la situación en mosaico es la misma que la de n-1, y después de agregar, solo hay una situación, por lo que el método es pave (n-1)

B: Hay dos columnas restantes al final, luego elimine las dos columnas primero y luego la situación es la misma que la n-2. Después de agregar estas dos columnas, hay tres situaciones: 1 2 se coloca verticalmente en 2 columnas, 1 2 se coloca horizontalmente y 2 2 Llenar directamente. Debido a que 1 2 se coloca verticalmente y se superpone con A, el número de métodos es pavimentar (n-2) * 2

En resumen: el número total de métodos = pavimentar (n-1) + 2 * pavimentar (n-2
Inserte la descripción de la imagen aquí

// An highlighted block
#include<iostream>
#include <algorithm>
#include<string>
using namespace std;
//用string实现大整数加法
string myadd(string a,string b){
    
    
	reverse(a.begin(),a.end());//字符串翻转
	reverse(b.begin(),b.end());
	int len;
	if(a.length()>b.length()){
    
    
		len=a.length(); //记录长的长度
		while(b.length()==len) b+=" ";//末尾补齐
	}else{
    
    
		len=b.length(); 
		while(a.length()==len) a+=" ";
	}
	int i=0,t=0;
	string ans;
	while(i<len){
    
    
		t+=a[i]-'0'+b[i]-'0';
		ans+=(t%10+'0');//拼接
		t/=10;
		i++;
	}
	if(t>0) ans+=t+'0';//进位加上
	reverse(ans.begin(),ans.end());
	return ans;
}

int main(){
    
    
	int n;
	string dp[1200];
	dp[0]="1";
	dp[1]="1";
	dp[2]="3";
	for(int i=3;i<=1000;i++){
    
    
		dp[i]=myadd(dp[i-1],myadd(dp[i-2],dp[i-2]));
	}
	while(cin>>n){
    
    	 
		cout<<dp[n]<<endl;
	}
	return 0;
}

1002 Problema C

Límite de tiempo: 2000/1000 MS (Java / Otros) | Límite de memoria: 65536/32768 KB (Java / Otros)
Envíos: 56 | Resuelto: 11

Descripción del Título

Un bloque N × N, la esquina superior izquierda es [1,1], la esquina inferior derecha es [N, N], (N <100). Ahora es necesario encontrar el número total de rutas desde la esquina superior izquierda hasta la esquina inferior derecha, cada vez que solo puede ir hacia abajo o hacia la derecha.

Hay M bloques en el camino con obstáculos (M <10), que no se pueden pasar, pero no conducirán a una situación en la que no se pueda llegar al punto final.

El número total de caminos en cada camino debe ser 10,000 para evitar el desbordamiento de datos.

Requisitos de entrada

La primera línea: dos números enteros N y M, representan respectivamente la dimensión del bloque y el número de obstáculos;

La segunda línea comienza con líneas M: el bloque donde se encuentra el obstáculo.

Requisitos de salida

Muestra el número de caminos que cumplen con el significado de la pregunta.

Ejemplo de entrada
3 1
3 1

Salida de muestra
5
Inserte la descripción de la imagen aquí

// An highlighted block
# include<iostream>
using namespace std;
int dp[101][101];  // 保存走到每个街区的路数

int main()
{
    
    
	for(int i=0;i<=100;i++)
		for(int j=0;j<=100;j++)
			dp[i][j] = 1;
	int n,m;  // 街区的维数和障碍数
	cin >> n >> m;
	while(m--)  // 将每个有障碍的街区置为0 
	{
    
    
		int a, b;
		cin >> a >> b;
		dp[a][b] = 0;
	}
	for(int i=1; i<=n; i++)
		for(int j=1; j<=n; j++)
		{
    
    
			if(dp[i][j] != 0)  //不考虑已经被置为0的有障碍的街区 
			{
    
    
				if(i==1 && j!=1)  // 给第一行街区赋值,不包括初始位置 
					dp[i][j] = dp[i][j-1];
				else if(i!=1 && j==1)  // 给第一列街区赋值,不包括初始位置
					dp[i][j] = dp[i-1][j];
				else if(i!=1 || j!=1)  //除初始位置的其他位置 
					dp[i][j] = (dp[i][j-1] + dp[i-1][j]) % 10000 ; // 每个街区的路径数为左边街区的路径数和上方路径数之和 
			}
		}
	 
	cout << dp[n][n] << endl; 
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_40852935/article/details/109170163
Recomendado
Clasificación