10/08/2020 (B - Jeu de papier 、 C - Rectangles 、 D - Séquences 、 I - Jouer avec des cordes)

Résumé du concours individuel 2020/8/10

Description du jeu

J'ai joué le match individuel hier soir. J'ai joué à div2 (mon poulet n'est équipé que de div2). Au total, 7 questions ont été posées. Parmi elles, il y a des questions sur l'eau, mais elles sont relativement bonnes. Je vais partager avec vous quelques questions je pense. Bonne question.

Problèmes

B - Jeu de papier

Insérez la description de l'image iciInsérez la description de l'image ici
Question: Donnez un morceau de papier n m, coupez-le à la plus petite taille de 11, et trouvez le plus de coupes, et jugez qui gagne et qui perd en fonction du nombre de coupes.

Idée: Trouvez un motif et constatez qu'un morceau de papier de n m peut être coupé au plus n m-1.

Code AC:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    
    
    int n;
    scanf("%d",&n);
    while(n--)
    {
    
    
        long long int x,y;
        scanf("%lld %lld",&x,&y);
        if(x*y%2)printf("Hussain\n");
        else 
            printf("Hasan\n");
        
    }
    return 0;
}

C - Rectangles

Insérez la description de l'image ici
Insérez la description de l'image ici
Signification de la question: Utilisez trois points i, j, k pour représenter le rectangle, où (i, 0) est le point dans le coin inférieur gauche du rectangle, (j, k) est le point dans le coin supérieur droit du rectangle, trouvez le nombre de rectangles donné Surface couverte.

Idée: utilisez un tableau à deux dimensions pour stocker un petit carré 1 * 1 et utilisez le sommet dans le coin supérieur droit du petit carré pour stocker la zone. Définissez-le sur 1 s'il est écrasé, sinon il vaut 0;

Code AC:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int a[110][110];
int main()
{
    
    
    int t;
    scanf("%d", &t);
    while (t--)
    {
    
    
        memset(a,0,sizeof(a));
        int n,i,sum=0;
        scanf("%d",&n);
        for(i=0; i<n; i++)
        {
    
    
            int j,k;
            int x,y,z;
            scanf("%d %d %d",&z,&x,&y);
            for(j=z+1; j<=x; j++)
            {
    
    
                for(k=1; k<=y; k++)
                {
    
    
                    if(a[j][k]==0)
                    {
    
    
                        a[j][k]++;
                        sum++;
                    }
                }
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}

D - Séquences

L'une des qualités les plus merveilleuses d'un ACMer est d'être multi-intérêts afin qu'il combine plusieurs qualifications et passe-temps pas seulement le codage. Hussain est l'un des ACMers les plus qualifiés à mentionner lorsqu'il parle de passe-temps et d'autres domaines de formation à la personnalité malgré ses qualifications en résolution de problèmes ACM et en mathématiques. On connaît très bien Hussain son obsession pour la chasse et le tir, il passait des heures à s'entraîner sur des boîtes vides dans son enfance. Ces jours-ci, Hussain est devenu un professionnel et défie encore les autres dans ce jeu, mais pour sa malchance, il a accidentellement défié un ACMer professionnel, sans mentionner le nom, donc cet ACMer a fait un jeu pour Hussain. Il a numéroté N cibles pour Hussain avec des nombres aléatoires et l'a défié de tirer le nombre minimum de cibles afin que les nombres restants forment une séquence de nombres croissants (d'un) dans leur ordre actuel. Exemple: s'il y a 6 cibles numérotées comme suit: 2 5 7 3 2 4 Hussain tirera 5,7 et le deuxième 2 restant pour 2 3 4. Maintenant, Hussain se concentrera sur le tir, nous l'aiderons et nous concentrerons sur les cibles il doit tirer. Mais non! Hussain est un très bon ACMer, nous allons lui rendre la tâche difficile et lui dire simplement le nombre de cibles restantes dans la séquence.

Entrée La
première ligne contient un entier T représente le nombre de cas de test 0 <T <100, chaque cas de test se compose de deux lignes, la première est un entier 0 <N <20000 représente le nombre de cibles, puis suivi de la deuxième ligne qui contient N nombres, chaque nombre 0 <Xi <20000 représente le nombre écrit sur la i'ème cible.
Sortie
Pour chaque cas de test, imprimer un nombre représentant la longueur de la séquence restante peut être créé par l'entrée où il devrait être la longueur maximale et chaque nombre suit son précédent de 1.
Exemples
Entrée

4
6
2 5 7 3 2 4
7
2 18 65 33 11 5 4
5
2 7 5 9 3
5
9 8 7 10 11

Output

3
1
2
3

Remarque

Please consider a large input file.

Signification de la question: Entrez plusieurs nombres d'affilée pour déterminer combien de nombres avec une tolérance de 1 de gauche à droite.

Idée: utilisez un tableau pour enregistrer l'état de chaque nombre, puis incrémentez-le et comparez la taille avec la valeur maximale.

Code AC:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int a[21000];
int main()
{
    
    
    int t;
    scanf("%d", &t);
    while (t--)
    {
    
    
        int n,i;
        scanf("%d", &n);
        int max = 0;
        memset(a, 0, sizeof(a));
        for (i = 0; i < n; i++)
        {
    
    
            int x;
            scanf("%d", &x);
            a[x] = 1;
            a[x] = a[x] + a[x - 1];
            if (max< a[x])
                max = a[x];
        }
        printf("%d\n", max);
    }
    return 0;
}

I - Jouer avec des cordes

Dani et Mike sont deux enfants, ils jouent à des jeux toute la journée et quand ils ne trouvent pas de jeu à jouer, ils inventent un jeu. Il y a environ une heure pour arriver à l'école, car ils adorent jouer avec des cordes Dani a inventé un jeu, étant donné une chaîne et le gagnant est le premier à former une chaîne palindrome en utilisant toutes les lettres de cette chaîne selon les exemples de règles suivants: 1- le joueur peut réorganiser les lettres pour former une chaîne. 2- la chaîne formée doit être palindrome et utiliser toutes les lettres de la chaîne donnée. 3- s'il y a plus d'une chaîne, choisissez la plus petite chaîne lexicographique. EX: string est «abacb» Le joueur peut former: «abcba» et «bacab», mais «abcba» est le plus petit lexicographiquement. Mike vous a demandé d'écrire un programme pour calculer la chaîne de palindrome afin qu'il puisse battre Dani.
Contribution

Votre programme sera testé sur un ou plusieurs cas de test. La première ligne de l'entrée sera un seul entier T, le nombre de cas de test (1 ≤ T ≤ 1000). Chaque cas de test sur une ligne contient une chaîne, la longueur de la chaîne ne dépassera pas 1000 lettres minuscules anglaises.
Production

Pour chaque cas de test, imprimez une seule ligne contenant la plus petite chaîne de palindrome lexicographiquement selon les règles ci-dessus. S'il n'y a pas de chaîne de ce type, imprimez «impossible»
Exemples
Entrée

4
abacb
acmicpc
aabaab
bsbttxs

Output

abcba
impossible
aabbaa
bstxtsb

Remarque

Palindrome string is a string which reads the same backward or forward.

Lexicographic order means that the strings are arranged in the way as they appear in a dictionary.

Question: Déterminez si une chaîne peut former une séquence de palindrome et affichez la séquence de palindrome correspondante (doit être dans l'ordre alphabétique).

Idée: solution violente

Code AC:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int a[50];
int main()
{
    
    
    int t;
    scanf("%d", &t);
    getchar();
    while (t--)
    {
    
    
        int sum = 0,m=0;
        memset(a, 0, sizeof(a));
        char s[1010], b[1010], mid;
        scanf("%s", s);
        int l = strlen(s);
        for (int i = 0; i < l; i++)
            a[s[i] - 'a' + 1]++;
        if (l % 2 == 0)
        {
    
    
            for (int i = 1; i < 27; i++)
                if (a[i] % 2 == 1)
                    sum++;
            if (sum > 0)
                printf("impossible");
            else
            {
    
    
                for (int i = 1; i < 27; i++)
                    if (a[i] > 0)
                    {
    
    
                        a[i] = a[i] / 2;
                        while (a[i]--)
                        {
    
    
                            char c = i - 1 + 'a';
                            b[m++] = c;
                            printf("%c",c);
                        }
                    }
            }
            for (int i = m - 1; i >= 0; i--)
                printf("%c",b[i]);
        }
        else
        {
    
    
            for (int i = 1; i < 27; i++)
                if (a[i] % 2 == 1)
                    sum++;
            if (sum != 1)
                printf("impossible");
            else
            {
    
    
                for (int i = 1; i < 27; i++)
                    if (a[i] > 0)
                    {
    
    
                        if (a[i] % 2 == 1)
                        {
    
    
                            mid = i - 1 + 'a';
                            a[i]--;
                        }
                        if (a[i] % 2 == 0)
                        {
    
    
                            a[i] = a[i] / 2;
                            while (a[i]--)
                            {
    
    

                                char c = i - 1 + 'a';
                                b[m++] = c;
                                printf("%c", c);
                            }
                        }
                    }
                printf("%c", mid);
                for (int i = m - 1; i >= 0; i--)
                    printf("%c",b[i]);
            }
        }
        printf("\n");
    }
    return 0;
}



Pour résumer

Cette compétition est un peu moins difficile. Certaines questions sont résolues violemment, et certaines nécessitent dp. Lors de l'écriture de code, il y a encore un peu de négligence, ce qui entraîne quelques erreurs mineures et perd du temps pour le débogage. La capacité de lecture en anglais doit encore être améliorée. Oui, allez! ! !

Je suppose que tu aimes

Origine blog.csdn.net/rookie636/article/details/107926759
conseillé
Classement