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≤nk≤En el caso de n , cuandok ≤ nk≤nk≤n 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 cnt
que 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;
}