Lista de resolución de problemas de la competencia provincial del Grupo B de la Copa Blue Bridge de octubre de 2020 (¡daño! Con archivo de título y parte del código ~)

Código de extracción de preguntas de la Copa Provincial Blue Bridge 2020 de Baidu Netdisk: 6666

A: fabricación de número de casa

Pregunta de inicio de sesión, la respuesta es 6246246 2 4


B: puntuación convencional

No hay nada que decir sobre esto, numerador y denominador de enumeración de doble bucle

Calcular mcd mcdG C D puede ser

Respuesta: 2481215


C: relleno de serpentina

El código es una simulación difícil, una vez hacia la parte inferior izquierda, una vez hacia la parte superior derecha ...

Respuesta: 761

#include <bits/stdc++.h>
using namespace std;
int a[50][50],cnt=1;
int main()
{
    for(int i = 1 ; i <= 40; i++)
	{
        if(i % 2==1 )
		{
            for(int x = i, y = 1; x >= 1 && y <= i; x--, y++)
                a[x][y] = cnt++;
        }
        else
		{
            for(int x = 1, y = i; x <= i && y >= 1; x++, y--)
                a[x][y] = cnt++;
        }
    }
    printf("%d\n", a[20][20]);
	return 0;
}

D: ejercicio de carrera

Abra un [13] un [13]una matriz [ 1 3 ] representa la cantidad de días de cada mes

Luego enumere todos los años, enumere todos los días

También es muy sencillo juzgar un año bisiesto al comienzo de cada año.

Respuesta: 8879


E: código de siete segmentos

Hay 7 77 tubos, todas las combinaciones son7! 7!7 ! Tipos, así que use enumeración binaria odfs dfsd f s buscar todo lo posible

Luego seleccionó algunos puntos, los dos puntos adyacentes tienen bordes

Puede usar la búsqueda de unión para determinar si está en un bloque conectado, o puede usar la búsqueda para determinar

Respuesta: 80


F: Estadísticas de puntuación

Nada que decir, redondee y sume 0.5 0.50 ... 5 enint inti n t es fina

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int n; cin >> n;
	double q=0,w=0;
	for(int i=1;i<=n;i++)
	{
		int x; cin >> x;
		if( x>=60 )	q+=100;
		if( x>=85 )	w+=100;
	}
	q/=n; w/=n;
	cout << (int)(q+0.5) << "%\n";
	cout << (int)(w+0.5) << "%";
}

G: fecha palíndromo

Todavía es una enumeración violenta cada año, y el número de palíndromos para ese año se determina después de que se determina el año.

Por ejemplo, un año determinado es abcd abcda b c d , entonces para formar un palíndromo, debe serdc dcd cba bab un cielo

Así que mire si el año no existe en este día, recuerde juzgar el año bisiesto

(Empecé a extrañar la situación en el primer año, ahora ha cambiado)

#include <bits/stdc++.h>
using namespace std;
int x,q,w,b[5];
int a[14]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool isok(int x)//判断闰年 
{
	if( x%400==0 )	return true;
	if( x%100==0 )	return false;
	if( x%4==0 )	return true;
	return false;
}
int main()
{
	cin >> x;
	int lday = x%100, lmonth = x%10000;//天,月份 
	x /= 10000;//年份 
	for(int i=x;;i++)
	{
		if( isok(i) )	a[2]=29;//判断闰年 
		else	a[2]=28;
		int temp=i;
		for(int j=1;j<=4;j++)//分解年份的数字
			b[j]=temp%10,temp/=10;
		int month=b[1]*10+b[2];//月份
		int day=b[3]*10+b[4];
		if( i==x && lmonth>month )	continue;//特判第一年 
		if( i==x && lmonth==month && lday>=day )	continue;//特判第一年 
		if( month>=1&&month<=12&&day>=1&&day<=a[month] )//存在这一天 
		{
			if( q==0 )	q=i*10000+month*100+day;//最近的回文串
			if( b[1]==b[3]&&b[2]==b[4] )	w= i*10000+month*100+day;//最近的AB型回文 
		}
		if( q&&w )//都找到了 
		{
			cout << q << "\n" << w;
			return 0;	
		} 
	} 
}

H: suma de puntuación de subcadena

Enumere violentamente cada subcadena y luego determine que la complejidad es O (n 3) O (n ^ 3)O ( n3 ), muy exagerado

Considere enumerar cada iisubcadena que comienza con i

显 而 fácil 见 子 brocheta [i, i] [i, i][ yo ,La contribución de i ] es1 11

Encontraremos el jj más pequeñoj满 衡a [i]! = a [j] a [i]! = a [j]a [ i ] !=a [ j ]

说明[yo, yo], [yo, yo + 1], [yo, yo + 2]. . . . . [i, j - 1] [i, i], [i, i + 1], [i, i + 2] ..... [i, j-1][ yo ,yo ] ,[ yo ,yo+1 ] ,[ yo ,yo+2 ] . . . . . [ yo ,j-La contribución de todas las subcadenas de 1 ] es1 11

Pero una vez para [i, j] [i, j][ yo ,j ] La contribución se convierte en2 22. En este momento, podemos encontrar otroa [q]! = A [i] a [q]! = A [i]a [ q ] !=a [ i ]a [q]! = a [j] a [q]! = a [j]a [ q ] !=a [ j ]

Entonces la misma contribución de cálculo es 2 2Subcadena de 2

De esta manera, el cálculo del salto solo necesita saltar como máximo 26 262 6 veces, porque cada letra salta como máximo una vez

Así que abre un id [27] [] id [27] []i d [ 2 7 ] [ ] matriz bidimensional para almacenar el subíndice de cada letra

#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
int id[27][maxn],nu[27],b[27];//下标
char a[maxn]; 
long long ans;
int main()
{
	cin >> (a+1);
	int len=strlen(a+1);
	for(int i=1;i<=len;i++)
		id[a[i]-'a'][++nu[a[i]-'a']]=i;//记录每个字母出现的下标 
	for(int i=1;i<=len;i++)//计算以i开头的子串的贡献 
	{
		int top=0;
		for(int j=0;j<=25;j++)//记录每个字母最快出现在i之后的下标
		{
		 	if( id[j][ nu[j] ] >= i )//假如出现最晚的这个字母比i大才去查找,而且需要是第一次出现 
		 	{
				int index = lower_bound(id[j],id[j]+1+nu[j],i)-id[j];//二分查找加速 
				b[++top] = id[j][index];
			}
		}
		sort(b+1,b+1+top);//对每个字母的出现时间排序
		int last = i;
		for(int j=2;j<=top;j++)
		{
			ans += ( b[j]-last )*(j-1) ;
			last = b[j];	
		}
		ans += ( len-last+1 )*top;	
	} 
	cout << ans;
}

Segmentación plana (esta es la regla que encontré yo mismo, solo como referencia)

Dibuje una imagen en la imagen y encuentre que si las dos líneas no son paralelas y no hay una intersección de tres puntos

2 4 7 11 16 22 29 37…

Solo sigue agregando 2 22 , suma3 33 , sume4 44 , sume5 55 , sume6 66

Suponga que un punto es xxSi pasan x líneas rectas, el número de planos formados será menorx - 1 x-1X-1 pieza

Si una pendiente tiene x (x> = 2) x (x> = 2)x ( x>=2 ) Una línea recta, el plano formado será1 + 2 + ... (X - 1) 1 + 2 + ... (x-1)1+2+. . . ( x-1 )

El código no se publica, después de todo, es solo una regla.


J. Clasificación de cadenas

Para citar a un compañero de equipo: (¡¿Soy demasiado tonto para escribirlo? !!)

Obviamente, si la longitud es la más corta, no podemos desperdiciar cada letra, por lo que debe haber letras en orden descendente,

Para que el orden lexicográfico sea el más corto, el número de cada letra debe reducirse, así que eso es todo,

Limite el número máximo de apariciones de cada letra y luego dfs dfs dfs burst search,

//Author : lifehappy的垫脚石 
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 10;
char ans[N], res[N];
int n, len;
bool judge() 
{
	int i = len;
	while(ans[i] == res[i] && i) i--;
	return res[i] < ans[i];
}
void dfs(int now, int maxn, int m, int sum) {
	if(sum == n) 
	{
		if(m < len || (m == len && judge()))
		{
			len = m;
			for(int i = 1; i <= len; i++) 	ans[i] = res[i];
		}
		return;
	}
	if(now >= 26) return ;
	for(int i = 1; i <= maxn; i++) 
	{
		int temp = sum + m * i;
		if(temp > n) return ;
		res[m + i] = char(now + 'a');
		dfs(now + 1, i, m + i, temp);
	}
}

int main()
{
    len = 0x3f3f3f3f;
    scanf("%d", &n);
    dfs(0, 8, 0, 0);
    for(int i = len; i >= 1; i--)
		putchar(ans[i]);
	return 0;
}


Supongo que te gusta

Origin blog.csdn.net/jziwjxjd/article/details/109136535
Recomendado
Clasificación