Liste de résolution de problèmes des compétitions provinciales du groupe B de la Coupe Blue Bridge d'octobre 2020 (dommage! Avec fichier titre et une partie du code ~)

Code d'extraction de question Baidu Netdisk 2020 Provincial Blue Bridge Cup: 6666

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 cba 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;
}


Je suppose que tu aimes

Origine blog.csdn.net/jziwjxjd/article/details/109136535
conseillé
Classement