Soluciones del Concurso AtCoder Beginner Contest 096

Problema A: El Día de Takahashi

Se proporcionan dos enteros m y d que representan el mes y el día. Se debe calcular cuántas fechas del año cumplen la condición de que el número del mes coincide con el número del día, desde el 1 de enero hasta la fecha indicada.

La lógica es simple: si el día es mayor que el mes, significa que ya pasaron todas las fechas "especiales" de ese mes, por lo que la respuesta es m - 1. En caso contrario, aún no se ha completado el mes actual, así que la respuesta es m.

#include <bits/stdc++.h>
using namespace std;

int mes, dia;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    cin >> mes >> dia;
    
    if (dia < mes) {
        cout << mes - 1 << '\n';
    } else {
        cout << mes << '\n';
    }
    
    return 0;
}

Problema B: Suma Máxima

Dados tres valores enteros y una cantidad k de operaciones disponibles. En cada operación se puede seleccionar uno de los tres números, duplicarlo y reemplazar el valor original. El objetivo es maximizar la suma total después de realizar exactamente k operaciones.

La estrategia óptima consiste en aplicar todas las operaciones sobre el valor más grande, ya que duplicar el número mayor genera el mayor incremento posible en cada paso.

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
ll x, y, z, operaciones;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    cin >> x >> y >> z >> operaciones;
    
    ll total = x + y + z;
    ll mayor = max({x, y, z});
    ll acumulado = mayor;
    
    for (int i = 0; i < operaciones; i++) {
        acumulado *= 2;
    }
    
    total = total - mayor + acumulado;
    cout << total << '\n';
    
    return 0;
}

Problema C: Repintado de Cuadrícula 2

Se recibe una matriz de dimensiones h × w donde # indica celdas que deben pintarse y . representa celdas vacías. La restricción es que cada operación de pintado debe cubrir exactamente dos celdas adyacentes (comparten un lado). Determinar si es posible pintar todas las celdas marcadas.

Para que el repintado sea factible, cada celda # debe tener al menos un vecino también marcado como #. Esto garantiza que todas las celdas puedan emparejarse sin quedar ninguna aislada.

#include <bits/stdc++.h>
using namespace std;

const int MAX = 1005;
int h, w;
char tablero[MAX][MAX];
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    cin >> h >> w;
    for (int i = 1; i <= h; i++) {
        for (int j = 1; j <= w; j++) {
            cin >> tablero[i][j];
        }
    }
    
    for (int i = 1; i <= h; i++) {
        for (int j = 1; j <= w; j++) {
            if (tablero[i][j] == '.') continue;
            
            bool tieneVecino = false;
            for (int dir = 0; dir < 4; dir++) {
                int ni = i + dx[dir];
                int nj = j + dy[dir];
                if (ni >= 1 && ni <= h && nj >= 1 && nj <= w) {
                    if (tablero[ni][nj] == '#') {
                        tieneVecino = true;
                        break;
                    }
                }
            }
            
            if (!tieneVecino) {
                cout << "No\n";
                return 0;
            }
        }
    }
    
    cout << "Yes\n";
    return 0;
}

Problema D: Cinco en Todas Partes

Construir una secuencia de n números primos (cada uno ≤ 55555) tal que cualquier subconjunto de 5 elementos tenga suma compuesta.

Observación clave: la suma de 5 números con el mismo dígito final siempre termina en 0 o 5, haciéndola divisible por 5. Por tanto, seleccionar primos que compartan la misma terminación (por ejemplo, terminados en 3) garantiza que cualquier combinación de 5 elementos sea compuesta.

#include <bits/stdc++.h>
using namespace std;

bool esPrimo(int num) {
    if (num < 2) return false;
    for (int div = 2; div * div <= num; div++) {
        if (num % div == 0) return false;
    }
    return true;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int cantidad;
    cin >> cantidad;
    
    int encontrados = 0;
    for (int candidato = 3; candidato <= 55555 && encontrados < cantidad; candidato += 10) {
        if (esPrimo(candidato)) {
            cout << candidato;
            encontrados++;
            if (encontrados < cantidad) cout << ' ';
        }
    }
    cout << '\n';
    
    return 0;
}

Etiquetas: atcoder Competitive Programming C++ Number Theory Graph Theory

Publicado el 8-6 22:50