Code d'extraction de question Baidu Netdisk 2020 Provincial Blue Bridge Cup: 6666
Annuaire ~
-
-
- A: création de numéro de maison
- B: partition conventionnelle
- C: remplissage serpentin
- D: Exercice de course
- E: code à sept segments
- F: Statistiques de score
- G: date palindrome
- H: somme des scores de sous-chaîne
- Segmentation de l'avion (c'est la règle que je me suis trouvée, pour référence seulement)
- J. Tri des chaînes
-
A: création de numéro de maison
Question de connexion, la réponse est 624 6246 2 4
B: partition conventionnelle
Il n'y a rien à dire à ce sujet, numérateur et dénominateur d'énumération à double boucle
Calculer le pgcd pgcdG C D peut être
Réponse: 2481215
C: remplissage serpentin
Le code est une simulation dure, une fois en bas à gauche, une fois en haut à droite ...
Réponse: 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: Exercice de course
Ouvrez un [13] a [13]un tableau [ 1 3 ] représente le nombre de jours de chaque mois
Puis énumérer chaque année, énumérer chaque jour
Il est également très simple de juger une année bissextile au début de chaque année
Réponse: 8879
E: code à sept segments
Il y a 7 77 tubes, toutes les combinaisons sont7! 7!7 ! Types, utilisez donc une énumération binaire oudfs dfsd f s recherche tout possible
Puis sélectionné quelques points, les deux points adjacents ont des arêtes
Vous pouvez utiliser la recherche d'union pour déterminer s'il se trouve dans un bloc connecté, ou vous pouvez utiliser la recherche pour déterminer
Réponse: 80
F: Statistiques de score
Rien à dire, arrondissez et ajoutez 0,5 0,50 .. 5 dansint inti n t est bien
#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: date palindrome
C'est toujours un dénombrement violent chaque année, et le nombre de palindromes pour cette année est déterminé après que l'année est déterminée
Par exemple, une certaine année est abcd abcda b c d , alors pour former un palindrome, il faut que ce soitdc dcd c月ba bab un paradis
Alors regardez si l'année n'existe pas ce jour-là, n'oubliez pas de juger l'année bissextile
(J'ai commencé à manquer la situation la première année, maintenant elle a changé)
#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: somme des scores de sous-chaîne
Énumérer violemment chaque sous-chaîne, puis déterminer que la complexité est O (n 3) O (n ^ 3)O ( n3 ), très exagéré
Pensez à énumérer chaque iisous-chaîne commençant par i
显 而 facile 见 子 brochette [i, i] [i, i][ i ,La contribution de i ] est de1 11
On trouvera le plus petit jjj满 衡a [i]! = a [j] a [i]! = a [j]un [ i ] !=a [ j ]
说明[i, i], [i, i + 1], [i, i + 2]. . . . . [i, j - 1] [i, i], [i, i + 1], [i, i + 2] ..... [i, j-1][ i ,i ] ,[ i ,je+1 ] ,[ i ,je+2 ] . . . . . [ i ,j-La contribution de toutes les sous-chaînes de 1 ] est1 11
Mais une fois à [i, j] [i, j][ i ,j ] La contribution devient2 22. A ce moment, nous pouvons trouver un autrea [q]! = A [i] a [q]! = A [i]un [ q ] !=a [ i ]且a [q]! = a [j] a [q]! = a [j]un [ q ] !=a [ j ]
Alors la même contribution de calcul est 2 2Sous-chaîne de 2
De cette façon, le calcul de saut n'a besoin que de sauter au plus 26 262 6 fois, car chaque lettre saute au plus une fois
Alors ouvrez un identifiant [27] [] identifiant [27] []i d [ 2 7 ] [ ] tableau à deux dimensions pour stocker l'indice de chaque lettre
#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;
}
Segmentation de l'avion (c'est la règle que je me suis trouvée, pour référence seulement)
Dessinez une image sur l'image et constatez que si les deux lignes ne sont pas parallèles et qu'il n'y a pas d'intersection à trois points
2 4 7 11 16 22 29 37…
Continuez simplement à ajouter 2 22 , ajouter3 33 , ajouter4 44 , ajouter5 55 , ajouter6 66 …
Supposons qu'un point soit xxSi x lignes droites passent, le nombre de plans formés sera moinsx - 1 x-1X-1 pièce
Si une pente a x (x> = 2) x (x> = 2)x ( x>=2 ) Une ligne droite, le plan formé sera1 + 2 + ... (X - 1) 1 + 2 + ... (x-1)1+2+. . . ( x-1 )
Le code n'est pas publié, après tout, ce n'est qu'une règle.
J. Tri des chaînes
Pour citer un coéquipier: (je suis trop idiot pour l'écrire ?? !!)
Évidemment, si la longueur doit être la plus courte, nous ne pouvons pas gaspiller chaque lettre, il doit donc y avoir des lettres dans l'ordre décroissant,
Pour que l’ordre lexicographique soit le plus court, le nombre de chaque lettre doit être réduit, donc c’est tout,
Limitez le nombre maximum d'occurrences de chaque lettre, puis 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;
}