B (DP)
Lo más importante es el impacto de la transición de estado en el mismo escenario,
Al igual que por qué 01 optimización de mochila necesita flashback, pero esta pregunta no es solo flashback, sino también para guardar la transferencia en esta etapa y finalmente guardar
Para evitar la influencia mutua en la misma etapa de la transferencia.
En cuanto a la clasificación, por supuesto, espero que cuanta más experiencia adicional quiera actualizar, mejor.
#include <bits / stdc ++. h> #define el registro RE #define P pair <int, int> #define PP pair <P, P> #define ll largo usando el espacio de nombres std; int n, x, y; ll f [ 501 ] [ 501 ], ff [ 501 ] [ 501 ]; PP a [ 501 ]; bool cmp (PP a, PP b) { return a.first.first < b.first.first; } int main () { scanf ( " % d% d% d " , & n, & x, y y); memset (f,0x3f3f3f3f , sizeof f); memset (ff, 0x3f3f3f3f , sizeof ff); ll bandera = f [ 0 ] [ 0 ]; f [ 0 ] [ 0 ] = 0 ; para (RE int i = 1 ; i <= n; ++ i) scanf ( " % d% d% d% d " , & a [i] .first.first, y a [i] .first.second, y a [ i] .second.first, y a [i] .second.second); sort (a + 1 , a + 1 + n, cmp); para (int i = 1 ; i <= n; ++ i) { para ( int c = 0 ; c <= x; ++ c) para ( int d = 0 ; d <= y; ++ d) ff [c] [d] = f [c] [ re]; for ( int c = x; c> = 0 ; - c) for ( int d = y; d> = 0 ; - d) { if (f [c] [d] == flag) continuar ; Si(c! =x) { int nc = c + a [i] .first.first; int nd = d; si (nc> x) nd + = nc - x, nc = x; nd = min (nd, y); ff [nc] [nd] = min (ff [nc] [nd], f [c] [d] + a [i] .primero.segundo); } int nd = min (d + a [i] .second.first, y); ff [c] [nd] = min (ff [c] [nd], f [c] [d] + a [i] .segundo.segundo); } para ( int c = 0 ; c <= x; ++c) para ( int d = 0 ; d <= y; ++ d) f [c] [d] = ff [c] [d]; } if (f [x] [y] == bandera) f [x] [y] = - 1 ; printf ( " % lld " , f [x] [y]); devuelve 0 ; }
D (terminado)
#include <bits / stdc ++. h> usando el espacio de nombres std; char s [ 1000005 ]; int a [ 26 ], len = 1 , n; vector < int > ve; int main () { scanf ( " % s " , s + 1 ); para ( int & i = len; s [i]; ++ i) ++ a [s [i] - ' a ' ]; --len; len >> = 1 ; para ( int i = 0 ; i < 26; ++ i) if (a [i]> = len) ve.emplace_back (i), ++ n; más si (a [i]) ++ n; if (ve.size ()> 1 || (ve.size () == 1 && n < 3 )) { put ( " NO " ); devuelve 0 ; } pone ( " SÍ " ); if (! ve.empty ()) { a [ve [ 0 ]] - = len; para ( int i =1 ; i <= len; ++ i) printf ( " % c " , ve [ 0 ] + ' a ' ); para ( int i = 0 ; i < 26 ; ++ i) if (a [i] && i! = ve [ 0 ]) { --a [i]; printf ( " % c " , ' a ' + i); romper ; } while (a [ve [ 0 ]] -) printf ( " % c " , ve [ 0] + ' a ' ); } para ( int i = 0 ; i < 26 ; ++ i) while (a [i]> 0 ) printf ( " % c " , i + ' a ' ), - a [i]; devuelve 0 ; }
F (poda de árboles, nim)
#include <bits / stdc ++. h> usando el espacio de nombres std; const int N = 1e5 + 5 ; vector < int > vec [N]; int n; int dfs ( int u, int fa) { int re = 0 ; para ( int i = 0 ; i <vec [u] .size (); ++ i) if (vec [u] [i]! = fa) re ^ = 1 + dfs (vec [u] [i], u); volver re; } intmain () { scanf ( " % d " , & n); para ( int i = 1 , a, b; i <n; ++ i) { scanf ( " % d% d " , & a, & b); vec [a] .push_back (b); vec [b] .push_back (a); } printf (dfs ( 1 , 0 )? " Alice " : " Bob " ); devuelve 0 ; }