ProgIng - Programación en Ingeniería
Loading...
Searching...
No Matches
Ejemplo004.c File Reference

Mínimo y máximo posible de niños en equipo rojo tras exactamente K cambios. More...

#include <stdio.h>
Include dependency graph for Ejemplo004.c:

Go to the source code of this file.

Functions

int main (int argc, char *argv[])
 Punto de entrada. Calcula mínimo y máximo tamaño del equipo rojo.

Detailed Description

Mínimo y máximo posible de niños en equipo rojo tras exactamente K cambios.

N niños se dividen en dos equipos: R en rojo y N-R en azul. Exactamente K niños se cambian de equipo (cada niño como máximo una vez). Se pide:

  • mínimo posible de niños en rojo al final
  • máximo posible de niños en rojo al final

Modelado: Sea x = # que cambian de rojo->azul. Entonces K-x cambian de azul->rojo. Rojo final: R_final = R - x + (K - x) = R + K - 2x con restricciones: 0 <= x <= R 0 <= K-x <= N-R

Entrada
N R K
#define N
Salida
Dos enteros: mínimo y máximo posibles en rojo.
Restricciones
1 ≤ N ≤ 1e5, 0 ≤ R,K ≤ N.
Complejidad
Tiempo: O(1). Memoria: O(1).

Definition in file Ejemplo004.c.

Function Documentation

◆ main()

int main ( int argc,
char * argv[] )

Punto de entrada. Calcula mínimo y máximo tamaño del equipo rojo.

Parameters
argcNo usado.
argvNo usado.
Returns
0 si finaliza correctamente.

Definition at line 42 of file Ejemplo004.c.

43{
44 (void)argc;
45 (void)argv;
46
47 int N, R, K, Rmn, Rmx;
48
49 scanf("%d %d %d", &N, &R, &K);
50
51 /*
52 Mínimo:
53 Se logra maximizando x (tantos rojos como sea posible se van a azul).
54 x_max = min(K, R)
55 Rmn = R + K - 2*x_max
56 Esto equivale a |R - K|.
57 El código implementa |R-K| sin if usando el signo:
58 (2*(R>=K)-1) es +1 si R>=K, -1 si R<K.
59 */
60 Rmn = (2*(R >= K) - 1) * (R - K);
61
62 /*
63 Máximo:
64 Se logra minimizando x (que se vayan lo menos posible del rojo).
65 x_min = max(0, K - (N - R))
66 Si K <= (N - R): Rmx = R + K
67 Si K > (N - R): Rmx = 2N - (R + K)
68 El código evita if usando booleanos.
69 */
70 Rmx = ((N - R) < K) * 2 * N
71 + (2 * ((N - R) >= K) - 1) * (R + K);
72
73 printf("%d\t%d\n", Rmn, Rmx);
74 return 0;
75}