Código de extracción de preguntas de la Copa Provincial Blue Bridge 2020 de Baidu Netdisk: 6666
Directorio ~
-
-
- A: fabricación de número de casa
- B: puntuación convencional
- C: relleno de serpentina
- D: ejercicio de carrera
- E: código de siete segmentos
- F: Estadísticas de puntuación
- G: fecha palíndromo
- H: suma de puntuación de subcadena
- Segmentación plana (esta es la regla que encontré yo mismo, solo como referencia)
- J. Clasificación de cadenas
-
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 c月ba 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;
}