Educación Codeforces Round 103 (Clasificado para Div. 2) 【A,B,C】题解

Ronda EDU 103 Div.2

Una suma K-divisible

significado del titulo

entrar nn ykk , el requisito está diseñado pornnSuma n enteros positivos para formar un número, y este número eskkmúltiplos de k , mientras se requiere estennEl valor máximo de n enteros positivos es lo más pequeño posible y se emite este valor máximo.

ideas

La primera es que k ≤ nk≤nkEn el caso de n , cuandok ≤ nk≤nkn ynnn %k = = 0 k==0k==0 __n está todo configurado en1 11 para satisfacer la condición. Si no se puede dividir, agregue1 11 , aumenta la suma akkel doble de k .
seguido dek > n k > nk>En el caso de n , cuandokkk puede sernnCuando n es divisible, el valor máximo del elemento esk / nk / nk / n , de lo contrario componen( k / n + 1 ) de k (k/n+1)( k / n+1 ) veces, el valor máximo esk / n + 1 k/n+1k / n+1 _

Código aceptado

#include <cstdio>
using namespace std;

int t;
int n, k;

int main() {
    
    
    scanf("%d", &t);
    while (t--) {
    
    
        scanf("%d%d", &n, &k);
        if (k >= n)
            printf("%d\n", ((int)(k / n) * n == k) ? (k / n) : (k / n + 1));
        else
            printf("%d\n", n % k == 0 ? 1 : 2);
    }
    return 0;
}

B inflación

significado del titulo

te da una longitud de nnsecuencia de n y akkk , requiere que la razón de cada número a la suma de los números a su izquierda sea menor o igual akkk %。

ideas

Almacene los datos con la matriz de suma de prefijos y luego recorra de atrás hacia adelante para asegurarse de que la relación de cada número con la suma del número de la izquierda cumpla con los requisitos. Si no cumple con los requisitos, p 0 p_0pag0aumentar el valor en kk para cumplir con kkk %, y ponerp 0 p_0pag0Los incrementos se registran.
p 0 p_0pag0El mayor incremento de es la respuesta.

Código aceptado

#include <cmath>
#include <cstdio>
using namespace std;

int t;
int n, k;
long long p[105];

int main() {
    
    
    scanf("%d", &t);
    while (t--) {
    
    
        scanf("%d%d", &n, &k);
        for (int i = 1; i <= n; i++) {
    
    
            scanf("%lld", &p[i]);
            if (i > 1) p[i] += p[i - 1];
        }
        long long inc = 0;
        for (int i = n; i > 1; i--) {
    
    
            if ((p[i] - p[i - 1]) * 1.0 / ((p[i - 1] + inc) * 1.0) >
                (k * 1.0 / 100.0)) {
    
    
                inc = ceil((100.0 * (p[i] - p[i - 1])) / (k * 1.0)) - p[i - 1];
            }
        }
        printf("%lld\n", inc);
    }
    return 0;
}

C Ciclo simple más largo

significado del titulo

tener nnn -artículo,ai a_iunyosignifica iiEl número del punto donde el primer punto de la cadena i está conectado a la cadena anterior,bi b_ibyosignifica iiEl número del punto donde el último punto de la cadena i está conectado a la cadena anterior,ci c_iCyosignifica iiLa longitud de las cadenas i (cuántos nodos en total). Encuentre el anillo con el mayor número de nodos y genere su número de nodos.

ideas

En el proceso de atravesar todas las cadenas, registre un medio anillo izquierdo máximo y, al mismo tiempo, tome la cadena actual como el medio anillo derecho cada vez, mantenga y actualice la longitud del anillo máximo. La variable que registra el medio anillo izquierdo más grande es , y la variable cntque registra el anillo más grande es ans.

/*
 * @Autor: CofDoria
 * @Date: 2021-01-27 20:40:49
 * @LastEditTime: 2021-01-30 12:56:11
 */
#include <algorithm>
#include <cmath>
#include <cstdio>
using namespace std;

int t, n;
long long cnt, ans;
long long a[100005], b[100005], c[100005];

int main() {
    
    
    scanf("%d", &t);
    while (t--) {
    
    
        cnt = 0;
        ans = 0;
        scanf("%d", &n);
        for (int i = 1; i <= n; i++) scanf("%lld", &c[i]);
        for (int i = 1; i <= n; i++) scanf("%lld", &a[i]);
        for (int i = 1; i <= n; i++) {
    
    
            scanf("%lld", &b[i]);
            if (i == 2) {
    
    
                cnt = llabs(b[i] - a[i]) + 1;
            }
            if (i > 2) {
    
    
                if (b[i] == a[i]) {
    
    
                    cnt = 1;
                } else {
    
    
                    cnt = max(llabs(a[i] - b[i]) + 1,
                              cnt + c[i - 1] - llabs(a[i] - b[i]) + 1);
                }
            }
            if (i >= 2) ans = max(ans, cnt + c[i]);
        }
        printf("%lld\n", ans);
    }
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_46144509/article/details/113412769
Recomendado
Clasificación