Solution du problème de la 6e Coupe Blue Bridge 2015

1. Nombre de billets de loterie

Certaines personnes sont très superstitieuses à propos des nombres. Par exemple, les nombres avec «4» pensent qu'ils sont homophoniques avec «mort», ce qui est malchanceux.

Bien que ces affirmations soient de pure absurdité, elles doivent parfois répondre aux besoins du public. Le numéro de loterie d'une loterie est composé de 5 chiffres (10000-99999), et le numéro avec "4" est obligatoire. L'organisateur vous demande de calculer combien de billets de loterie peuvent être émis si deux billets de loterie ne sont pas dupliqués.

Veuillez soumettre le nombre (un entier) et n'écrivez aucun contenu supplémentaire ou texte descriptif.

 答案:52488

Idée: énumération violente

Méthode 1 : 10000 ~ 99999,

Méthode 2 : 5 couches pour la boucle

Code (méthode 1):

#include<stdio.h>
int main()
{
	int i,g,s,b,q,w;
	int ans=0;
	for(i=10000;i<=99999;i++)
	{
		g=i%10;
		s=i/10%10;
		b=i/100%10;
		q=i/1000%10;
		w=i/10000;
		if(g!=4&&s!=4&&b!=4&&q!=4&&w!=4)
			ans++;
	}
	printf("%d\n",ans);
	return 0;
}

Code (méthode 2):

#include<stdio.h>
int main()
{
	int g,s,b,q,w,ans=0;
	for(w=1;w<=9;w++)
		for(q=0;q<=9;q++)
			for(b=0;b<=9;b++)
				for(s=0;s<=9;s++)
					for(g=0;g<=9;g++)
						if(w!=4&&q!=4&&b!=4&&s!=4&&g!=4)
							ans++;
	printf("%d\n",ans);
	return 0;
}

2. Galaxy Bomb

Il existe de nombreuses "bombes" artificielles X-star flottant dans le vaste espace de la galaxie X, qui sont utilisées comme panneaux de signalisation dans l'univers.

Chaque bombe peut exploser en quelques jours.
Par exemple, si la bombe Alpha est placée le 1er janvier 2015 et que le délai est de 15 jours, elle explosera le 16 janvier 2015.
Il existe une bombe bêta, qui a été placée le 9 novembre 2014, avec une durée de 1 000 jours. Veuillez calculer la date exacte à laquelle elle a explosé.

Veuillez indiquer la date, le format est aaaa-mm-jj, qui est une année à 4 chiffres, un mois à 2 chiffres et une date à 2 chiffres. Par exemple: 2015-02-19
veuillez écrire en stricte conformité avec le format. Aucun autre mot ou symbole ne peut apparaître.

答案:2017-08-05

Idée et code

3. Offre de trois moutons

Observez la formule d'addition suivante:

    祥 瑞 生 辉
+   三 羊 献 瑞
-------------------
 三 羊 生 瑞 气

(S'il y a un problème d'alignement, veuillez vous référer à [Figure 1.jpg])
Insérez la description de l'image ici

Parmi eux, les mêmes caractères chinois représentent les mêmes nombres, et différents caractères chinois représentent des nombres différents.

Veuillez remplir les 4 chiffres représentés par "Sanyang Xianrui" (la réponse est unique), et ne remplissez aucun contenu redondant.

答案:1085

Idées:

Il y a un total de 8 nombres différents dans le titre, {Auspicious, Rui, Sheng, Hui, Three, Sheep, Xian, Qi}, chaque mot représente un nombre différent, (0 ~ 9),

Méthode 1:
organiser tout (0 ~ 9), puis prendre les 8 premiers et les amener dans le jugement de calcul.

Méthode 2:
8 couches pour boucle, chaque couche de boucle représente un mot

Code (méthode 1):

#include<stdio.h>
#include<algorithm>
using namespace std;
int a[11]={0,1,2,3,4,5,6,7,8,9};
int main()
{
	do
	{
		if(a[4]==0)
			continue; 
		int x=a[0]*1000+a[1]*100+a[2]*10+a[3];
		int y=a[4]*1000+a[5]*100+a[6]*10+a[1];
		int z=a[4]*10000+a[5]*1000+a[2]*100+a[1]*10+a[7];
		if(x+y==z)
			printf("%d%d%d%d\n",a[4],a[5],a[6],a[1]); 
	}while(next_permutation(a+0,a+10));//左开右闭 
	return 0;
}

Code (méthode 2):

#include<stdio.h>
int cnt[20];
int judge(int a,int b,int c,int d,int e,int f,int g,int h)
{
	int i;
	for(i=0;i<=9;i++)
		cnt[i]=0;
	cnt[a]++;cnt[b]++;cnt[c]++;cnt[d]++;
	cnt[e]++;cnt[f]++;cnt[g]++;cnt[h]++;
	for(i=0;i<=9;i++)
	{
		if(cnt[i]>1)
			return 0;
	}
	return 1;
}
int main()
{
	int a,b,c,d,e,f,g,h,x,y,z;
	for(a=0;a<=9;a++)//祥 
		for(b=0;b<=9;b++)//瑞 
			for(c=0;c<=9;c++)//生 
				for(d=0;d<=9;d++)//辉 
					for(e=1;e<=9;e++)//三 
						for(f=0;f<=9;f++)//羊 
							for(g=0;g<=9;g++)//献 
								for(h=0;h<=9;h++)//气 
								{ 
									x=a*1000+b*100+c*10+d;
									y=e*1000+f*100+g*10+b;
									z=e*10000+f*1000+c*100+b*10+h;
									if(x+y==z&&judge(a,b,c,d,e,f,g,h)==1)//不仅相等&&不能重复 
										printf("%d%d%d%d\n",e,f,g,b);
								}
	return 0;
}

4. Sortie dans la grille

La fonction StringInGrid imprimera la chaîne spécifiée dans une grille d'une taille spécifiée.
La chaîne doit être centrée dans les directions horizontale et verticale.
Si la chaîne est trop longue, elle est tronquée.
S'il ne peut pas être centré, vous pouvez le déplacer légèrement vers la gauche ou vers le haut.

Le programme suivant implémente cette logique, veuillez remplir le code manquant dans la partie soulignée.

#include <stdio.h>
#include <string.h>

void StringInGrid(int width, int height, const char* s)
{
	int i,k;
	char buf[1000];
	strcpy(buf, s);
	if(strlen(s)>width-2) buf[width-2]=0;

	printf("+");
	for(i=0;i<width-2;i++) printf("-");
	printf("+\n");

	for(k=1; k<(height-1)/2;k++){
		printf("|");
		for(i=0;i<width-2;i++) printf(" ");
		printf("|\n");
	}

	printf("|");

	printf("%*s%s%*s",_____________________________________________);  //填空
          
	printf("|\n");

	for(k=(height-1)/2+1; k<height-1; k++){
		printf("|");
		for(i=0;i<width-2;i++) printf(" ");
		printf("|\n");
	}	

	printf("+");
	for(i=0;i<width-2;i++) printf("-");
	printf("+\n");	
}

int main()
{
	StringInGrid(20,6,"abcd1234");
	return 0;
}

Pour les données dans le titre, il devrait être sorti: s'il vous plaît voir l'image

Insérez la description de l'image ici

Remarque: ne remplissez que le contenu manquant, n'écrivez aucun code ou texte explicatif existant sur le titre.

答案:(width-strlen(s)-2)/2,"",buf,(width-strlen(s)-2)/2,""

Idées:

L'impression est divisée en cinq parties, la première ligne, le milieu supérieur, le milieu, le milieu inférieur et la dernière ligne.

Remarque:

%*s中的*实际就是空格要输入对应个数  
如%*s    5,"" 五个空格

5. Neuf scores de groupe

1,2,3… 9 Ces neuf nombres forment une partition et sa valeur est exactement de 1/3 Comment le grouper?

Le programme suivant implémente cette fonction, veuillez remplir le code manquant dans la partie soulignée.

#include <stdio.h>

void test(int x[])
{
	int a = x[0]*1000 + x[1]*100 + x[2]*10 + x[3];
	int b = x[4]*10000 + x[5]*1000 + x[6]*100 + x[7]*10 + x[8];

	if(a*3==b) printf("%d / %d\n", a, b);
}

void f(int x[], int k)
{
	int i,t;
	if(k>=9){
		test(x);
		return;
	}

	for(i=k; i<9; i++){
		{t=x[k]; x[k]=x[i]; x[i]=t;}
		f(x,k+1);
		_____________________________________________ // 填空处
	}
}

int main()
{
	int x[] = {1,2,3,4,5,6,7,8,9};
	f(x,0);	
	return 0;
}

Remarque: ne remplissez que le contenu manquant, n'écrivez aucun code ou texte explicatif existant sur le titre.

答案:{t=x[k]; x[k]=x[i]; x[i]=t;}

Idées:

Le titre indique que 9 nombres forment une fraction, donc il doit y avoir 4 chiffres dans le numérateur et 5 chiffres dans le dénominateur. Cette question est en fait une question d'arrangement complète de 1 à 9. Pensez-y, si toutes les permutations peuvent être connues, alors nous pouvons complètement supposer que les 4 premiers chiffres sont le numérateur et les 4 derniers chiffres sont le dénominateur, alors nous devons seulement déterminer si chaque arrangement remplit les conditions un par un.
La fonction f () dans la question simule juste toutes les méthodes d'arrangement, car la pensée récursive est utilisée, il doit y avoir un retour en arrière (retour au dernier état). f (x, k + 1); La ligne ci-dessus {t = x [k]; x [k] = x [i]; x [i] = t;}, puis pour revenir à l'état d'origine, le La ligne suivante doit également {t = x [k]; x [k] = x [i]; x [i] = t;}

6. Ajout à la multiplication

Nous savons tous: 1 + 2 + 3 +… + 49 = 1225
Vous devez maintenant transformer les deux signes plus non adjacents en signes de multiplication, ce qui donne le résultat 2015

Par exemple:
1 + 2 + 3 +… + 10 11 + 12 +… + 27 28 + 29 +… + 49 = 2015
est la réponse qui répond aux exigences.

Veuillez chercher une autre réponse possible et soumettez le nombre à gauche du signe de multiplication en première position (par exemple, soumettez 10).

Remarque: ce que vous devez soumettre est un entier, ne remplissez aucun contenu supplémentaire.

答案:16

Idée: simulation violente

Nous savons déjà qu'il y a un total de 49 nombres et 48 symboles. Maintenant, laissez les symboles avoir 2 signes de multiplication, et les positions des signes de multiplication ne peuvent pas être continues, alors nous simulerons les positions de tous les signes de multiplication pour voir quelle position est le plus approprié.

Code:

#include<stdio.h>
int main()
{
	int i,j,a,b;
	int sum=1225;
	for(i=1;i<=48;i++)            //i表示乘号的第一个位置 
	{
		a=-(i+i+1)+(i*(i+1));     //加变乘所产生的变化 
		for(j=i+2;j<=48;j++)      //j表示乘号的第二个位置 
		{
			b=-(j+j+1)+(j*(j+1)); //加变乘所产生的变化 
			if(sum+a+b==2015)
			{
				printf("%d\n",i);
			}
		}
	}
	return 0;
}

7. Nombre de types de cartes

Xiao Ming a été détourné vers Casino X et forcé de jouer aux cartes avec 3 autres personnes.
Un jeu de cartes à jouer (sans les grands et petits atouts, un total de 52), réparti uniformément à 4 personnes, chacune avec 13 cartes.
À ce moment, une question est soudainement apparue dans l'esprit de Xiao Ming:
si vous ne considérez pas les couleurs, seulement les points, et non l'ordre des cartes que vous obtenez, combien de types de combinaisons de cartes initiales pouvez-vous obtenir dans votre main?

Veuillez remplir le nombre entier, ne pas remplir de contenu supplémentaire ni de texte explicatif.

Titre:

Faites attention à la question pour ne pas mal comprendre le sens de la question. L'accent est mis sur la combinaison de cartes. Le
sens de la question est que la couleur n'est pas prise en compte. Il existe 13 types de cartes, 4 de chaque carte. La signification de la question est que l'ordre des cartes n'est pas considéré Le problème se transforme en problème de combinaison mathématique. Par conséquent, l'intention de la question est maintenant que 13 cartes peuvent être tirées au hasard à partir de 52 cartes et il est demandé combien de méthodes de dessin différentes existent.

Idées de résolution de problèmes: simulation violente

Pour chaque type de carte, le nombre que nous tirons est 0,1,2,3,4, et 13 variables sont utilisées pour représenter différents types de cartes, c'est-à-dire 13 pour les boucles, tant que le nombre final de cartes tirées est de 13. , Est une méthode de dessin appropriée. Mais si vous utilisez 13 niveaux de boucles for, le délai expirera. En fait, vous pouvez utiliser 12 types de boucles for ici. Nous n'avons qu'à juger du type de carte 13.

Code:

#include<stdio.h>
int main()
{
	int i,j,k,l,m,n,o,p,q,r,s,t,cnt,ans=0;
	long long sum=0;
	for(i=0;i<=4;i++)
		for(j=0;j<=4;j++)
			for(k=0;k<=4;k++)
				for(l=0;l<=4;l++)
					for(m=0;m<=4;m++)
						for(n=0;n<=4;n++)
							for(o=0;o<=4;o++)
								for(p=0;p<=4;p++)
									for(q=0;q<=4;q++)
										for(r=0;r<=4;r++)
											for(s=0;s<=4;s++)
												for(t=0;t<=4;t++)
													{
														cnt=i+j+k+l+m+n+o+p+q+r+s+t;
														if(cnt<=13&&cnt>=9)
															ans++;
													}
	printf("%d\n",ans);
	return 0;
}
//3598180

Ce qui suit en présente un avec moins de code et moins de temps

Code:

#include<stdio.h>
int ans;
//必须把所有的堆数遍历一遍 
void dfs(int step,int sum)
{//step表示第几堆,sum表示手中的牌数
  if(sum>13)//剪枝 
		return;
	if(step==14)//走到了不存在的堆的面前再次查看自己手中的牌 
	{
 		if(sum==13)//如果手中的牌恰好是13,则是一种选择 
			ans++;
		return; 
	}

	int i;
 for(i=0;i<=4;i++)
 {
  	  sum+=i;//一次性在x堆拿i张牌
     dfs(step+1,sum);//去下一堆
   	 sum-=i;//把i张牌再放回去,选择再去拿i+1张牌
  }
  return;
}
int main()
{
 ans=0;
	dfs(1,0);//站在第一堆面前,起初手中为0张牌
  printf("%d\n",ans);
 return 0;
}

Je suppose que tu aimes

Origine blog.csdn.net/Helinshan/article/details/115263598
conseillé
Classement