La primera solución de problema individual de la 13.ª Competencia Provincial de la Copa Lanqiao (2022)

Pregunta de prueba A: Convertir nueve a decimal (5 puntos)

Insertar descripción de la imagen aquí
Respuesta:

1478

Código:

#include<bits/stdc++.h>
using namespace std;
int main(){
    
    
	long long  ans = 2*1+2*9+0*pow(9,2)+2*pow(9,3);
	cout<<ans; 
	return 0;
} 

Pregunta B: Cita directa (5 puntos)

[Descripción del problema]
A Xiao Ming le gusta especialmente Shunzi. Una escalera se refiere a tres números consecutivos: 123, 456, etc. La fecha directa se refiere a la representación aaaammdd de la fecha.Cualquier tres dígitos consecutivos es una fecha directa.. Por ejemplo, 20220123 es una fecha directa.Porque salió escalera: 123;Y 20221023 no es una fecha exacta, no tiene fecha exacta. Xiao Ming quiere saber cuántas fechas consecutivas hay en todo el año 2022.
[Envío de respuesta]
Esta es una pregunta para completar en blanco, solo necesita calcular el resultado y enviarlo. El resultado de esta pregunta es un número entero. Complete solo este número entero cuando envíe la respuesta. No se otorgarán puntos si completa contenido adicional.

Pensamientos: Un inconveniente de esta pregunta es: ¿012 cuenta como escalera?

Respuesta (cuenta como cero):

14

No cuenta:

4

Código 1: (0 cuentas)

#include<bits/stdc++.h>
using namespace std;
int dt[15] = {
    
    0,31,28,31,30,31,30,31,31,30,31,30,31};
int f[5];
bool check(){
    
    
	for(int i = 2; i <=3;i++){
    
    
		if(f[i-1]+1==f[i]&&f[i]+1==f[i+1]) return true;
	}
	return false;
}
int main(){
    
    
	int ans = 0;
	for(int i = 1; i<= 12;i++){
    
    
		for(int j = 1; j <= 31;j++){
    
    
			f[1]= 0,f[2]=0,f[3]=0,f[4]=0;
			if(j<=dt[i]){
    
    
				if(i>=10){
    
    
					f[1] = i/10; f[2] = i%10;
				}else f[2] = i%10;
				
				if(j>=10){
    
    
					f[3] = j/10; f[4] = j%10;
				}else f[4] = j%10; 
				if(check()) ans++;
			}
		}
	}
	cout<<ans;
	return 0;
} 

Código (sin contar 0):

#include<bits/stdc++.h>
using namespace std;
int dt[15] = {
    
    0,31,28,31,30,31,30,31,31,30,31,30,31};
int f[5];
bool check(){
    
    
	for(int i = 2; i <=3;i++){
    
    
		if(f[i-1]+1==f[i]&&f[i]+1==f[i+1]&&f[i-1]&&f[i]&&f[i+1]) return true;
	}
	return false;
}
int main(){
    
    
	int ans = 0;
	for(int i = 1; i<= 12;i++){
    
    
		for(int j = 1; j <= 31;j++){
    
    
			f[1]= 0,f[2]=0,f[3]=0,f[4]=0;
			if(j<=dt[i]){
    
    
				if(i>=10){
    
    
					f[1] = i/10; f[2] = i%10;
				}else f[2] = i%10;
				
				if(j>=10){
    
    
					f[3] = j/10; f[4] = j%10;
				}else f[4] = j%10; 
				if(check()) ans++;
			}
		}
	}
	cout<<ans;
	return 0;
} 

Pregunta C: Estadísticas (10 puntos)

Insertar descripción de la imagen aquí
Ejemplo de entrada:

10 20 99

Muestra de salida:

8

Insertar descripción de la imagen aquí
Pensamientos: ¿Lo que estaba pensando era escribir sobre la violencia primero y luego resolverlo semana tras semana? Comprime el bucle y
no habrá tiempo.

Código: (Se estima que el agua no se agotará)

#include<bits/stdc++.h>
using namespace std;
int main(){
    
    
	long long a,b,n;
	cin>>a>>b>>n;
	long long sum = 0,cnt = 0;
	while(sum<n){
    
    
		for(int i = 1; i <= 7;i++){
    
    
			if(i>5) sum += b,cnt++;
			else sum += a,cnt++;
			if(sum>=n){
    
    
				cout<<cnt;
				return 0;
			}
		}
	}
	
	return 0;
}

Pregunta D: Poda de arbustos (10 puntos)

Insertar descripción de la imagen aquí
Ejemplo de entrada:

3

Muestra de salida:

4
2
4

Insertar descripción de la imagen aquí
Código: (Esta pregunta no debería caducar)

#include<bits/stdc++.h>
using namespace std;
int main(){
    
    
	int n;
	cin>>n;
	for(int i = 1;i<=n;i++){
    
    
		int ans  = 2*max(i-1,n-i);
		cout<<ans<<endl;
	}
	return 0;
}

Pregunta de prueba E: resta de base X (15 puntos) ¡dfs está fuera! Larga vida

[Descripción del problema]
El sistema base especifica cuántos dígitos de un número deben avanzarse en uno.
¡La base X es un sistema de bases muy mágico porque la base de cada dígito no es fija! Por ejemplo, para un determinado número de base X, el dígito más bajo es binario, el segundo dígito es decimal y el tercer dígito es octal, luego el número de base X 321 se convierte en un número decimal de 65.
Ahora hay dos números enteros A y B expresados ​​en base binaria. Calcule el resultado mínimo posible de AAB.
Tenga en cuenta,necesitasAsegúrese de que tanto A como B sean legales en el sistema base X, es decir, el número de cada dígito debe ser menor que su sistema base.
[Formato de entrada]
La primera línea es un número entero positivo N, el significado es el indicado en el título.
La segunda línea contiene un número entero positivo Ma, que representa el número de dígitos en el número base X A.
La tercera línea contiene Ma enteros separados por espacios, que representan la
representación decimal de los números en cada dígito del número A en base X en orden de mayor a menor.
La cuarta línea contiene un número entero positivo Mb, que representa el número de dígitos en el número base X B.
La quinta línea contiene números enteros Mb separados por espacios, que representan la
representación decimal de los números en cada dígito del número base X B en orden de mayor a menor.
Tenga en cuenta que todos los números de la entrada están en decimal.
[Formato de salida]
Genera un número entero por línea, que representa el valor mínimo posible del resultado del número base X AB
después de la conversión a decimalLuego modele el resultado de 1000000007.
Insertar descripción de la imagen aquí

Ejemplo de entrada:

11
3
10 4 0
3
1 2 0

Muestra de salida:

94

Pensamientos: ¡
Siento que esta pregunta es tan repugnante ahora! Dios mío, me tomó casi dos horas escribirlo y depurarlo. Dios mío,
finalmente salió el dfs, guau, es genial, pero parece que no se tomó ni envió ningún molde.

Código:

#include<bits/stdc++.h>
using namespace std;
int n,ma,mb,ans = 99999999;
int a[100005];
int b[100005];
void dfs(int x,int y,int sa,int sb,int sum){
    
    //两个数位  权值ji
	if(x==ma&&y==mb){
    
    
		ans = min(ans,sa-sb);
		return;
	}else{
    
    
		for(int i = 2; i <=n;i++){
    
     //n是最大倍数
		 
 			if(a[x]>=i||b[x]>=i) continue;  //剪枝 
 			
 			sum *= i;
			sa += a[x+1]*sum; sb += b[y+1]*sum;
			dfs(x+1,y+1,sa,sb,sum);
			
			sa -= a[x+1]*sum; sb -= b[y+1]*sum;
			sum /= i;
		}
	}
}
int main(){
    
    
	cin>>n;
	cin>>ma;
	for(int i = ma; i >=1;i--) cin>>a[i];
	cin>>mb;
	for(int i = mb; i >= 1;i--) cin>>b[i];
	dfs(1,1,a[1],b[1],1);
	cout<<ans;
	return 0;
}

No es fácil tomar el modelo durante la búsqueda. No quiero ajustarlo. Supongo que no funcionará.

#include<bits/stdc++.h>
using namespace std;
int n,ma,mb;
int a[100005];
int b[100005];
typedef long long ll;
const ll mod = 1000000007;
ll ans = 99999999;

void dfs(int x,int y,ll sa,ll sb,ll sum){
    
    //两个数位  权值ji
	if(x==ma&&y==mb){
    
    
		ans = min(ans,(sa%mod-sb%mod)%mod);
		//cout<<"................."<<endl;
		//cout<<"xy: "<<x<<" "<<y<<" "<<" he: "<<sa<<" "<<sb<<" ans: "<<ans<<endl;
		return;
	}else{
    
    
		for(int i = 2; i <=n;i++){
    
     //n是最大倍数
		 
 			if(a[x]>=i||b[x]>=i) continue;  //剪枝 
			//cout<<"be: "<<i<<" xy: "<<x<<" "<<y<<" he: "<<sa<<" "<<sb<<" ji: "<<sum<<" "<<ans<<endl; 
 			sum *= i;
			sa += a[x+1]*sum; sb += b[y+1]*sum;
			dfs(x+1,y+1,sa,sb,sum);
			sa -= a[x+1]*sum; sb -= b[y+1]*sum;
			sum /= i;
		}
	}
}
int main(){
    
    
	cin>>n;
	cin>>ma;
	for(int i = ma; i >=1;i--) cin>>a[i];
	cin>>mb;
	for(int i = mb; i >= 1;i--) cin>>b[i];
	dfs(1,1,a[1],b[1],1);
	cout<<ans;
	return 0;
}

Pregunta F: Submatrices estadísticas (15 puntos)

Insertar descripción de la imagen aquí
Ejemplo de entrada:

3 4 10
1 2 3 4
5 6 7 8
9 10 11 12

Muestra de salida:

19

[Descripción del ejemplo]
Hay 19 submatrices que cumplen las condiciones, entre ellas:
10 con un tamaño de 1 × 1.
Hay 3 del tamaño 1×2.
Hay 2 del tamaño 1×3.
Hay 1 talla 1×4.
Hay 3 de tamaño 2×1.
Insertar descripción de la imagen aquí
Pensamientos: Prefijo bidimensional directo y parece que lo escribí mal

Supongo que te gusta

Origin blog.csdn.net/qq_52626583/article/details/124103572
Recomendado
Clasificación