Apprentissage de l'algorithme du langage C (algorithme mathématique, euclidien, théorie des probabilités)

Je n'ai résolu que quatre questions aujourd'hui, ce qui est inconfortable

résolu

Un gateau d'anniversaire

Reformulation du problème:

• Lucy et Lily sont jumelles et c'est aujourd'hui leur anniversaire. Mère leur a acheté un gâteau d'anniversaire. Maintenant, le gâteau est placé dans un système de coordonnées cartésien, le centre du gâteau est à (0,0) et le rayon du gâteau est de 100.
• Il y a 2N (N est un entier, 1≤N≤50) cerises sur le gâteau. Maman coupera le gâteau en deux avec un couteau (en ligne droite bien sûr). Les jumeaux doivent naturellement être traités équitablement, c'est-à-dire que les deux moitiés du gâteau doivent avoir la même forme (c'est-à-dire que la ligne droite doit passer par le centre du gâteau), et chaque moitié du gâteau doit avoir N cerises. Pouvez-vous l'aider?
• Notez ici que les coordonnées (x, y) de la cerise sont deux entiers. Vous voulez donner cette ligne sous la forme de deux entiers A, B (représentant Ax + By = 0), et A et B sont dans [−500, 500]. Les cerises ne peuvent pas être en ligne droite. Pour chaque cas de test, il existe au moins une solution.

entrer

• L'entrée contient plusieurs cas de test. Chaque cas de test est composé de deux parties: la première partie donne un nombre N sur une ligne, et la seconde partie se compose de 2N lignes, chaque ligne a deux nombres, représentant (x, y). Il n'y a qu'un seul espace entre les deux nombres. L'entrée se termine par N = 0.

Production

• Pour chaque cas de test, sortez une ligne, donnant deux nombres A et B, avec un espace entre les deux nombres. S'il existe plusieurs solutions, affichez simplement l'une d'entre elles.

Analyse des questions

• Entrez N dans la première ligne de cette question, ce qui signifie qu'il y a 2N cerises sur le gâteau. Chacune des 2N lignes suivantes donne les coordonnées d'une cerise. Comme le gâteau est un cercle avec l'origine au centre et un rayon de 100, la plage de valeurs de coordonnées est [-100, 100]. Le résultat de cette question est une équation de ligne droite Ax + By = 0 A et B, la plage est [-500, 500].
• Cette question adopte la méthode d'énumération, énumère A et B dans la plage de [-500, 500] et remplace les coordonnées de la cerise dans l'équation linéaire Ax + By. Si Ax + By est supérieur à 0, la cerise est au-dessus line; s'il est inférieur à 0, alors La cerise est en dessous de la ligne droite; si elle est égale à 0, ce n'est pas autorisé car la cerise ne peut pas être sur la ligne droite. Énumérer jusqu'à ce que la première solution soit produite.

Code source

#include <iostream>

using namespace std;

const int LEFT = -500, RIGHT = 500;
const int N = 50;
int x[N * 2], y[N * 2];

int main()
{
    
    
    int n;
    while(~scanf("%d", &n) && n) {
    
    
        n *= 2;

        for(int i = 0; i < n; i++)
            scanf("%d%d", &x[i], &y[i]);

        bool flag = true;
        for(int a = LEFT; a <= RIGHT && flag; a++)
            for(int b = LEFT; b <= RIGHT ; b++) {
    
    
                if(a==0 && b==0 ) continue;
                int i, cnt = 0;     // 统计满足AX+BY>0的点数目
                for(i = 0; i < n; i++) {
    
    
                    if(a * x[i] + b * y[i] > 0) ++cnt;
                    else if(a * x[i] + b * y[i] == 0) break;
                }
                if( i < n) continue;
                if(cnt == n / 2) {
    
    
                    printf("%d %d\n", a, b);
                    flag = false;
                    break;
                }
            }
    }

    return 0;
}

B Est-ce cette intégration?

Reformulation du problème

Sur la figure, il y a un carré ABCD, où AB = BC = CD = DA = a. Avec les quatre sommets A, B, C, D comme centre et a comme rayon, dessinez quatre arcs: l'arc avec A comme centre commence à partir du sommet adjacent B et se termine au sommet adjacent D; tous les autres Les arcs sont dessinés de la même manière. Comme le montre la figure, trois zones de formes différentes sont dessinées dans le carré de cette manière, et chaque zone est représentée par une teinte différente. Veuillez calculer la superficie totale des différentes parties ombrées.
Insérez la description de l'image ici

entrer

• Chaque ligne d'entrée reçoit un nombre à virgule flottante a (0 <a <10000), qui représente la longueur des côtés du carré. L'entrée se termine par EOF.

Production

• Pour chaque ligne d'entrée, sortez une ligne, donnant la surface totale de trois parties ombrées différentes:
donnez trois nombres à virgule flottante avec trois décimales, le premier nombre représente la surface totale de la zone rayée, et le le deuxième chiffre représente la superficie totale de la zone en pointillé, le troisième chiffre indique la superficie des zones restantes.

Exemple d'entrée

0,1
0,2
0,3

Exemple de sortie

0,003 0,005 0,002
0,013 0,020 0,007
0,028 0,046 0,016

Résolution des problèmes

Insérez la description de l'image ici

Analyse des questions

• Cette question donne la longueur du côté a d'un carré et nécessite de calculer la surface totale de trois parties ombrées différentes. Comme le montre la figure, dessinez un triangle équilatéral avec des lignes auxiliaires, et les zones des trois différentes parties ombrées sont représentées par x, y et z.

Code source

#include<iostream>
#include<cmath>
using namespace std;
const double pi=acos(-1);
int main() {
    
    
	double a;
	while(cin>>a) {
    
    
		double z=a*a-pi*a*a/6.0-sqrt(3.0)/4.0*a*a;
		double y=(a*a-pi*a*a/4.0-2.0*z);
		double x=(a*a-4.0*y-4.0*z);
		printf("%.3lf %.3lf %.3lf\n",x,y*4.0,z*4.0);
	}
}/*
        double z = r * r * (1 - PI / 6.0 - sqrt(3.0) / 4);
        double y = r * r * (1 - PI / 4.0 ) - 2 * z;
        double x = r * r  * (PI / 2.0 - 1) - 2 * y;
		*/

C Division simple

Reformulation du problème

Insérez la description de l'image ici
L'opération de division entière entre le dividende n et le diviseur d produit le quotient q et le reste r. q est un entier qui maximise q d tel que q d ≤ n et r = n − q * d.
• Étant donné un ensemble d'entiers, il existe un entier d tel que lorsque chaque entier donné est divisé par d, le reste est le même.

entrer

• Chaque ligne d'entrée donne une séquence d'entiers différents de zéro séparés par des espaces. Le dernier nombre de chaque ligne est 0, qui n'appartient pas à cette séquence. Il y a au moins 2 dans une séquence et au plus 1000 nombres; les nombres dans une séquence ne sont pas tous égaux. La dernière ligne d'entrée donne un seul 0 et le programme n'a pas besoin de traiter cette ligne.

Production

• Pour chaque ligne d'entrée, sortez le plus grand entier de sorte que chaque entier de l'entrée soit divisé par le nombre avec le même reste.

Exemple d'entrée

701 1059 1417 2312 0
14 23 17
32122 0 14-22 17-31-124 0
0

Exemple de sortie

179
3
3

Résolution des problèmes

Code source

#include <algorithm>
#include<iostream>
using namespace std;
int gcd(int x,int y) {
    
    
	int r;
	while (x%y!=0) {
    
    
		r=x%y;
		x=y;
		y=r;
	}
	return y;
}
int main() {
    
    
	int a1, a;
	while(~scanf("%d", &a1) && a1) {
    
    
		int g = 0;
		while(scanf("%d", &a) == 1 && a) {
    
    
			int d = a - a1;
			if(d) {
    
    
				if(g) g = gcd(g, d);
				else g = d;
			}
			a1 = a;
		}
		printf("%d\n", abs(g));
	}

	return 0;
}

G - burger

Reformulation du problème

• Les fils jumeaux des Clinton, Ben et Bill, ont célébré leur 10e anniversaire et la fête a eu lieu au restaurant McDonald's au 202 South Broadway à New York. La fête a réuni 20 enfants, dont Ben et Bill. Ronald McDonald a préparé 10 hamburgers au bœuf et 10 cheeseburgers. Lorsqu'il a servi les enfants, il a commencé avec la fille assise à gauche de Bill et Ben assis à droite de Bill. Ronald a jeté une pièce pour décider si la fille mangerait un hamburger au bœuf ou un cheeseburger. Le côté de la tête de la pièce est le hamburger au bœuf et le contraire est le cheeseburger. Avant que ce ne soit le tour de Ben et Bill, Ronald a répété le processus avec les 17 autres enfants. Quand Ronald est venu à Ben, il n'avait plus besoin de lancer une pièce, car il n'y avait pas de cheeseburger, seulement deux hamburgers de boeuf.
• Ronald McDonald a été très surpris par cela, il voulait donc connaître la probabilité que ce genre de chose se produise. Pour le processus ci-dessus, veuillez calculer la probabilité que Ben et Bill mangent le même hamburger. Ronald McDonald fait toujours griller le même nombre de burgers de bœuf et de cheeseburgers.

analyse du problème

Insérez la description de l'image ici
Comme vous pouvez le voir sur la figure ci-dessus, vous pouvez utiliser hors ligne pour résoudre, (la première fois que vous utilisez une méthode hors ligne, non qualifiée)

Code source

#include<iostream>
#include<cmath>
using namespace std;
const int N=5e4+7;
int cas,n;
double p[N];
void solve()
{
    
    
	p[1]=1;
	for(int i=1;i<N-1;++i)
		p[i+1]=(2*i-1)*p[i]/(2*i);
}
int main(){
    
    
	solve();
	cin>>cas;
	while(cas--){
    
    
		cin >>n;
		n/=2;
		printf("%.4lf\n",1-p[n]);
	}
	return 0;
}

Partie non résolue

D - Problème Euclide

D'après Euclide, on sait que pour tout entier positif A et B, il existe de tels entiers X et Y que AX + BY = D, où D est le plus grand diviseur commun de A et B.Le problème est de trouver pour A et B correspondant X, Y et D.

Contribution

L'entrée sera constituée d'un ensemble de lignes avec les nombres entiers A et B, séparés par un espace
(A, B <1000000001).

Production

Pour chaque ligne d'entrée, la ligne de sortie doit être composée de trois entiers X, Y et D, séparés par un espace.
S'il y en a plusieurs X et Y, vous devez sortir cette paire pour laquelle | X | + | Y | est le minimum. S'il y a plusieurs X et Y satisfaisant aux critères minimaux, sortez la paire pour laquelle X ≤ Y.

Exemple d'entrée

4 6
17 17

Exemple de sortie

-1 1 2
0 1 17

analyse du problème

Évidemment, ce problème devrait être fait avec l'algorithme euclidien étendu

int exgcd(int a, int b, int &x, int &y) {
    
    
	if (b==0) {
    
    
		x=1;
		y=0;
		return a;
	}
	int t=exgcd(b, a%b, x, y);
	int x0=x, y0=y;
	x=y0;
	y=x0-(a/b)*y0;
	return t;

}

Cependant, je n'ai pas de climatisation et je ne trouve pas la raison

Code source

#include <cstdio>
#include <cmath>
#include <iostream>
using namespace std;
int exgcd(int a, int b, int &x, int &y) {
    
    
	if (b==0) {
    
    
		x=1;
		y=0;
		return a;
	}
	int t=exgcd(b, a%b, x, y);
	int x0=x, y0=y;
	x=y0;
	y=x0-(a/b)*y0;
	return t;
}
int main() {
    
    
	int a, b, x, y, d;
	while(~scanf("%d%d", &a, &b)) {
    
    
		d = exgcd(a, b, x, y);
		printf("%d %d\n",x,y);
	}
	return 0;
}

F - Quelle est la probabilité?

La probabilité a toujours fait partie intégrante des algorithmes informatiques. Là où les algorithmes déterministes n'ont pas réussi à résoudre un problème en peu de temps, les algorithmes probabilistes sont venus à la rescousse. Dans ce problème, nous n'avons affaire à aucun algorithme probabiliste. Nous allons simplement essayer de déterminer la probabilité de gain d'un certain joueur.
Un jeu se joue en lançant un dé comme une chose (il ne faut pas supposer qu'il a six faces comme un dé ordinaire). Si un certain événement se produit lorsqu'un joueur lance les dés (comme obtenir un 3, obtenir le côté vert sur le dessus ou autre), il est déclaré vainqueur. Il peut y avoir N de tels joueurs. Alors le premier
le joueur lancera les dés, puis le deuxième et enfin le N-ième joueur et à nouveau le premier joueur et ainsi de suite. Lorsqu'un joueur obtient l'événement souhaité, il est déclaré gagnant et le jeu s'arrête. Vous devrez déterminer la probabilité de gain de l'un (le I-ème) de ces joueurs.

Contribution

L'entrée contiendra d'abord un entier S (S ≤ 1000), qui indique le nombre d'ensembles d'entrées. Les lignes S suivantes contiendront S ensembles d'entrées. Chaque ligne contient un entier N (N ≤ 1000) qui désigne le nombre de joueurs, un nombre à virgule flottante p qui indique la probabilité que se produise un événement réussi en un seul lancer (si le succès signifie obtenir 3 alors p est la probabilité d'obtenir 3. Pour un dé normal, la probabilité d'obtenir 3 est de 1/6) et I (I ≤ N) la série du joueur dont la probabilité de gagner doit être déterminée (le numéro de série varie de 1 à N). Vous pouvez supposer qu'aucune valeur de probabilité § invalide ne sera donnée en entrée.

Production

Pour chaque ensemble d'entrées, indiquez sur une seule ligne la probabilité que le I-ème joueur gagne. Le
nombre à virgule flottante de sortie aura toujours quatre chiffres après la virgule décimale, comme indiqué dans l'exemple de
sortie.

Exemple d'entrée

2
2 0,166666 1
2 0,166666 2

Exemple de sortie

0,5455
0,4545

analyse du problème

Insérez la description de l'image ici
Bien que j'aie remplacé la formule, je n'ai pas de climatisation et je ne trouve pas la raison

Code source

#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int main() {
    
    
	int N,i,n;
	double p;
	scanf("%d",&N);
	for(int j=0; j<N; j++) {
    
    
		cin >>n >>p >>i;
		float proba =(pow((1-p),i-1)*p/(1-pow((1-p),n)));
		printf("%.4f\n",proba);
	}
}

Il reste encore beaucoup de problèmes aujourd'hui, je ne sais pas quand j'aurai le temps de les résoudre

Je suppose que tu aimes

Origine blog.csdn.net/seekerzhz/article/details/112910421
conseillé
Classement