Any fool can write code that a computer can understand. Good programmers write code that humans can understand.
Martin Fowler
A good way to stay flexible is to write less code.
Pragmatic Programmer
In short, software is eating the world.
Marc Andreessen
Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.
Linus Torvalds
Entrenamiento semanal.
Cualquier duda no dudes en contactar.
Entrenamiento Semana 1 - Diciembre ⬇️
Clasificación Avanzados
Puesto
Usuario
Puntos
Tiempo
319
543
338
1
d.mestanza.2017
3
1690107
1
1
1
2
a.voychuk.2021
3
1691907
1
1
1
Actualizada: 05/12/2021 - 15:31
Clasificación Iniciación
Puesto
Usuario
Puntos
Tiempo
114
116
194
1
e.pascualg.2020
3
1566349
1
1
1
2
i.penedo.2020
3
1684693
1
1
1
3
d.palacios.2020
3
1684929
1
1
1
4
x.liu1.2020
3
1684942
1
1
1
5
m.siles.2021
3
1685213
1
1
1
6
ma.bourial.2021
3
1685433
1
1
1
7
ra.toaza.2016
3
1685683
1
1
1
8
da.barbera.2020
3
1685850
1
1
1
9
s.garciarod.2020
3
1685992
1
1
1
10
r.fauste.2020
3
1687372
1
1
1
11
a.cruzm.2018
3
1689810
1
1
1
12
j.ramirez.2020
2
1125262
1
1
0
13
i.garcial.2020
2
1127606
1
1
0
14
m.zucchi.2019
2
1128290
1
1
0
15
i.gomeze.2019
0
0
0
0
0
16
aj.alanis.2020
0
0
0
0
0
17
a.amaya.2020
0
0
0
0
0
18
n.martinezc.2020
0
0
0
0
0
19
fc.vazquez.2018
0
0
0
0
0
20
lm.camino.2020
0
0
0
0
0
21
a.pinaz.2020
0
0
0
0
0
22
a.elyaacoubi.2021
0
0
0
0
0
23
d.haro.2018
0
0
0
0
0
24
a.arcones.2020
0
0
0
0
0
25
j.pina.2020
0
0
0
0
0
Actualizada: 13/12/2021 - 15:31
Solución Problemas Avanzados
Problema 319 Acepta el Reto - La máquina calculadora
Ver solución en C++
Ver solución en Java
#include<bits/stdc++.h>
using namespace std;
int used[10500];
int BFS(int start, int target){
queue<pair<int,int> > q;
q.push(make_pair(start,0));
while(!q.empty()){
pair<int,int> current = q.front(); q.pop();
if(current.first == target) return current.second;
int sum = (current.first+1+10000)%10000;
if(used[sum]==0)
{
used[sum]= 1;
q.push(make_pair(sum ,current.second+1));
}
int mul = (current.first*2+10000)%10000;
if(used[mul]==0)
{
used[mul]= 1;
q.push(make_pair(mul,current.second+1));
}
int div = current.first/3;
if(used[div]==0)
q.push(make_pair((current.first/3),current.second+1));
}
return -1;
}
int main()
{
int a,b;
while(scanf("%d",&a)!=EOF)
{
cin>>b;
memset(used,0,sizeof(used));
cout<<BFS(a,b)<<endl;
}
return 0;
}
import java.util.LinkedList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while(in.hasNext()){
int inicio=in.nextInt();
int fin = in.nextInt();
boolean[] visitados = new boolean[10005];
int solucion=0;
LinkedList<Integer> cola = new LinkedList<>();
cola.addFirst(inicio);
cola.addFirst(null);
if(inicio==fin){
System.out.println(0);
}
else{
while(cola.size()>1){
Integer elemento = cola.removeLast();
if(elemento==null){
solucion++;
cola.addFirst(null);
}
else{
int sumauno = (elemento+1)%10000;
int multdos = (elemento*2)%10000;
int divtres = (elemento/3)%10000;
if(sumauno==fin)break;
if(multdos==fin)break;
if(divtres==fin)break;
if(!visitados[sumauno]){
visitados[sumauno]=true;
cola.addFirst(sumauno);
}
if(!visitados[multdos]){
visitados[multdos]=true;
cola.addFirst(multdos);
}
if(!visitados[divtres]){
visitados[divtres]=true;
cola.addFirst(divtres);
}
}
}
System.out.println(solucion+1);
}
}
}
}
Problema 543 Acepta el Reto - Tensión en las playas
Ver solución en C++
Ver solución en Java
#include <bits/stdc++.h>
using namespace std;
struct circleS{
int x,y,r;
};
int circle(circleS a, circleS b)
{
return (pow(abs(a.x-b.x),2)+pow(abs(a.y-b.y),2))<pow((a.r+b.r),2);
}
int main(){
int cases; scanf("%d",&cases);
while(cases--){
int n; scanf("%d",&n);
vector<circleS> V;
for(int i=0; i<n;i++){
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
V.push_back({a,b,c});
}
int res = 0;
for(int i=0; i<n;i++){
for(int j=i+1;j<n;j++) if(circle(V[i],V[j])) res++;
}
printf("%d\n",res);
}
return 0;
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int casos = in.nextInt();
for(int t=0; t<casos; t++){
int n = in.nextInt();
Sombrilla[]sombrillas = new Sombrilla[n];
int cont = 0;
for(int i=0; i<n; i++){
sombrillas[i]= new Sombrilla(in.nextInt(), in.nextInt(), in.nextInt());
for(int j=0; j<i; j++){
if(sombrillas[i].intesec(sombrillas[j])){
cont++;
}
}
}
System.out.println(cont);
}
}
}
class Sombrilla{
int x, y, r;
public Sombrilla(int x, int y, int r) {
this.x = x;
this.y = y;
this.r = r;
}
boolean intesec (Sombrilla s){
double d = Math.sqrt((y-s.y)*(y-s.y)+(x-s.x)*(x-s.x));
return r+s.r >d;
}
}
Problema 338 Acepta el Reto - Detectando copiones
Ver solución en C++
Ver solución en Java
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)==2)
{
map<int,int> Maux;
map<int,int> M;
queue<int> Q;
int val,res=0,res1=0,num=0;
for(int i=0; i<n;i++)
{
cin>>val;
M[val]++;
Maux[val]++;
if(Maux[val]>1) res++;
num++;
if(num>m) { num--; Maux[Q.front()]--; Q.pop();}
Q.push(val);
}
for(auto m:M) if(m.second>1) res1+=(m.second-1);
printf("%d %d\n",res1,res);
}
return 0;
}
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()){
int n = in.nextInt();
int k = in.nextInt();
boolean[] copias = new boolean[100001];
int[] profesor = new int[100001];
Queue<Integer> cola = new LinkedList<>();
int c = 0;
int p = 0;
for(int i=0; i<n; i++){
int e = in.nextInt();
if(cola.size()>k){
int s = cola.poll();
profesor[s]--;
}
if(copias[e]){
c++;
}
else{
copias[e]=true;
}
int m = profesor[e];
if(m>0){
p++;
}
profesor[e]++;
cola.add(e);
}
System.out.println(c+" "+p);
}
}
}
Solución Problemas Iniciación
Problema 116 Acepta el Reto - ¡Hola mundo!
Ver solución en C++
Ver solución en Java
#include <bits/stdc++.h>
using namespace std;
int main() {
int cases; cin>>cases;
while(cases--)
{
cout<<"Hola mundo.\n";
}
return 0;
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
for(int i=0; i<n; i++){
System.out.println("Hola mundo.");
}
}
}
Problema 194 Acepta el Reto - Salvemos al lince ibérico
Ver solución en C++
Ver solución en Java
#include <bits/stdc++.h>
using namespace std;
int main(){
int cases; scanf("%d",&cases);
while(cases--){
int total=0;
string line; cin>>line;
for(unsigned int i=0; i<line.length();i++){
if(line[i]=='.'){ total++; i+=2; }
}
printf("%d\n",total);
}
return 0;
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
for(int i=0; i<n; i++){
String s = br.readLine();
int cont = 0;
int j = 0;
while(j<s.length()){
if(s.charAt(j)=='.'){
cont++;
j+=3; //j= j+3;
}
else{
j++;
}
}
System.out.println(cont);
}
}
}
Problema 114 Acepta el Reto - Último dígito del factorial
Ver solución en C++
Ver solución en Java
#include <bits/stdc++.h>
using namespace std;
int main() {
int T;
cin >> T;
while (T--) {
int n; cin >> n;
if (n == 0) cout << 1 << endl;
else if (n == 3) cout << 6 << endl;
else if (n < 5) cout << n << endl;
else cout << 0 << endl;
}
return 0;
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n= in.nextInt();
for(int i=0;i<n;i++){
int x=in.nextInt();
if(x>=5) System.out.println(0);
else if(x==4) System.out.println(4);
else if(x==3) System.out.println(6);
else if(x==2) System.out.println(2);
else if(x==1 || x==0) System.out.println(1);
}
}
}
Entrenamiento Semana 2 - Diciembre ⬇️
Clasificación Avanzados
Puesto
Usuario
Puntos
Tiempo
352
570
204
1
m.siles.2021
3
1700911
1
1
1
2
a.voychuk.2021
1
565777
0
1
0
3
d.mestanza.2017
0
0
0
0
0
Actualizada: 13/12/2021 - 15:31
Clasificación Iniciación
Puesto
Usuario
Puntos
Tiempo
590
141
452
1
e.pascualg.2020
3
1658958
1
1
1
2
x.liu1.2020
3
1694087
1
1
1
3
a.pinaz.2020
3
1694947
1
1
1
4
m.siles.2021
3
1695142
1
1
1
5
s.garciarod.2020
3
1695608
1
1
1
6
i.penedo.2020
3
1699770
1
1
1
7
d.palacios.2020
3
1702447
1
1
1
8
da.barbera.2020
3
1704807
1
1
1
9
i.garcial.2020
1
567208
0
0
1
10
i.gomeze.2019
0
0
0
0
0
11
aj.alanis.2020
0
0
0
0
0
12
r.fauste.2020
0
0
0
0
0
13
a.amaya.2020
0
0
0
0
0
14
a.cruzm.2018
0
0
0
0
0
15
j.ramirez.2020
0
0
0
0
0
16
n.martinezc.2020
0
0
0
0
0
17
fc.vazquez.2018
0
0
0
0
0
18
lm.camino.2020
0
0
0
0
0
19
a.elyaacoubi.2021
0
0
0
0
0
20
d.haro.2018
0
0
0
0
0
21
m.zucchi.2019
0
0
0
0
0
22
a.arcones.2020
0
0
0
0
0
23
j.pina.2020
0
0
0
0
0
24
ma.bourial.2021
0
0
0
0
0
25
ra.toaza.2016
0
0
0
0
0
Actualizada: 13/12/2021 - 20:24
Solución Problemas Avanzados
Problema 352 Acepta el Reto - Los amigos de mis amigos son mis amigos
import java.util.*;
public class Main2 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
for (int p = 0; p < n; p++) {
int nodos = in.nextInt();
int aristas = in.nextInt();
ArrayList<Integer>[] grafo = new ArrayList[nodos];
for(int j=0; j<nodos; j++){
grafo[j]=new ArrayList<>();
}
for (int i = 0; i < aristas; i++) {
int a = in.nextInt() - 1;
int b = in.nextInt() - 1;
grafo[a].add(b);
grafo[b].add(a);
}
boolean[] visitados = new boolean[nodos];
int maximo = 0;
for (int r = 0; r < nodos; r++) {
if (!visitados[r]) {
int inicial=r;
Queue<Integer> cola = new LinkedList<>();
cola.add(inicial);
int contador = 1;
visitados[inicial] = true;
while (cola.size() > 0) {
Integer pop = cola.remove();
for (int i = 0; i < grafo[pop].size(); i++) {
int aux = grafo[pop].get(i);
if (!visitados[aux]) {
cola.add(aux);
visitados[aux] = true;
contador++;
}
}
}
maximo = Math.max(maximo, contador);
}
}
System.out.println(maximo);
}
}
}
Problema 570 Acepta el Reto - DNI incompleto
Ver solución en C++
Ver solución en Java
#include <bits/stdc++.h>
using namespace std;
#define SET(v,i) memset(v,i,sizeof(v));
#define FOR(i,n,k) for(int i=n;i<k;++i)
#define WHILE(i,n) while(i<n)
#define RI(i) scanf("%d",&i);
#define RS(i) scanf("%s",i);
#define RF(i) scanf("%lf",&i);
#define RL(i) scanf("%lld",&i);
#define OPEN(s) freopen(s,"r",stdin);
#define CLOSE(s) freopen(s,"w",stdout);
const int INF=0x3F3F3F3F;
const int MAXN=100001;
typedef long long int i64;
typedef pair<int,int> pii;
typedef pair<string,int> psi;
map<char, int> M;
void preproc(){
M['T'] = 0; M['R'] = 1; M['W'] = 2; M['A'] = 3; M['G'] = 4; M['M'] = 5; M['Y'] = 6;
M['F'] = 7; M['P'] = 8; M['D'] = 9; M['X'] = 10; M['B'] = 11; M['N'] = 12; M['J'] = 13;
M['Z'] = 14; M['S'] = 15; M['Q'] = 16; M['V'] = 17; M['H'] = 18; M['L'] = 19; M['C'] = 20;
M['K'] = 21; M['E'] = 22;
}
char str[50];
int bt(int idx, int tot, vector<int> &missing, int remainder){
if(idx >= (int)missing.size()) return tot%23 == remainder;
int ans = 0;
FOR(i,0,10){
ans += bt(idx+1, tot+missing[idx]*i, missing, remainder);
}
return ans;
}
int main(){
preproc();
int t; RI(t);
while(t--){
vector<int> missing;
RS(str);
int tot = 0;
int n = strlen(str);
int multiplier = 1e7;
FOR(i,0,n-1){
if(str[i] != '?')
tot += (str[i] -'0')*multiplier;
else{
missing.push_back(multiplier);
}
multiplier/=10;
}
int letter_remainder = M[str[n-1]];
printf("%d\n", bt(0, tot, missing, letter_remainder));
}
return 0;
}
////////////////////////////////////////////
/////////////Code by David Moran////////////
////////////////////////////////////////////
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
HashMap<Character,Integer> letras = new HashMap<>();
char[] aux = {'T','R','W','A','G','M','Y','F','P','D','X','B','N','J','Z','S','Q','V','H','L','C','K','E'};
for(int i=0;i<23;i++){
letras.put(aux[i],i);
}
for(int i=0;i<n;i++){
StringBuffer dni= new StringBuffer(in.next());
dni.reverse();
int resto = letras.get(dni.charAt(0));
int numero = 0;
LinkedList<Integer> inter=new LinkedList<>();
for(int j=1;j<9;j++){
if(dni.charAt(j)=='?'){
inter.add(j-1);
}else{
numero+=((dni.charAt(j)-48)*(Math.pow(10,j-1)));
}
}
numero=numero%23;
HashMap<Integer,Integer> posibles = new HashMap<>();
posibles.put(numero,1);
int it=1;
for(Integer m:inter){
HashMap<Integer,Integer> auxiliar = new HashMap();
for(Integer k:posibles.keySet()){
for(int j=0;j<10;j++){
int nuevo = (int) ((k+j*Math.pow(10,m))%23);
if(auxiliar.containsKey(nuevo)){
auxiliar.put(nuevo,auxiliar.get(nuevo)+posibles.get(k));
}
else{
auxiliar.put(nuevo,posibles.get(k));
}
}
}
posibles=auxiliar;
}
System.out.println(posibles.get(resto));
}
}
}
Problema 204 Acepta el Reto - Árbol de navidad
Ver solución en C++
Ver solución en Java
#include <bits/stdc++.h>
using namespace std;
string line;
bool flag;
pair<int,int> solve(int index, int value){
if(!flag) return {index,value};
if(line[index]=='.') return {index,value};
if(line[index]=='*') return {index,value+1};
pair<int,int> res;
res = solve(index+1,value); //left node
int left = res.second;
res = solve(res.first+1,value); //right node
if(abs(left-res.second)>1) flag = false;
res.second+=left;
return res;
}
int main(){
while(getline(cin,line)){
flag = true;
solve(0,0);
if(flag) printf("OK\n");
else printf("KO\n");
}
return 0;
}
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Scanner;
public class Main {
public static class Node{
Boolean adorno;
Node left,right;
public Node(Boolean adorno) {
this.adorno = adorno;
}
public Node(Boolean adorno, Node left, Node right) {
this.adorno = adorno;
this.left = left;
this.right = right;
}
}
public static Node arbol(String lectura){
int contador=0;
Node devolver = new Node(false);
LinkedList pila = new LinkedList<>();
pila.addFirst(devolver);
while(!pila.isEmpty()){
Node aux = pila.removeFirst();
if(lectura.charAt(contador)=='.'){
aux.adorno=false;
}
else if(lectura.charAt(contador)=='*'){
aux.adorno=true;
}
else{
aux.adorno=false;
aux.left=new Node(false);
aux.right=new Node(false);
pila.addFirst(aux.right);
pila.addFirst(aux.left);
}
contador++;
}
return devolver;
}
public static int balanceado(Node nodo){
int izquierdo=0;
int derecho=0;
if(nodo.right!=null && nodo.left!=null){
derecho=balanceado(nodo.right);
izquierdo=balanceado(nodo.left);
}
else{
if(nodo.adorno) return 1;
else return 0;
}
if(Math.abs(izquierdo-derecho)>1) return -1;
if(izquierdo==-1 || derecho==-1) return -1;
return izquierdo+derecho;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while(in.hasNext()){
int x=balanceado(arbol(in.next()));
if(x==-1) System.out.println("KO");
else System.out.println("OK");
}
}
}
Solución Problemas Iniciación
Problema 590 Acepta el Reto - A caballo por el viñedo
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static int INF=1000000001;
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(in.readLine()," ");
int racimos = Integer.parseInt(st.nextToken());
int necesatios = Integer.parseInt(st.nextToken());
while(racimos!=0 || necesatios!=0){
int[] vi = new int[racimos];
st = new StringTokenizer(in.readLine()," ");
for(int i=0;i<racimos;i++){
vi[i]=Integer.parseInt(st.nextToken());
}
int m=0;
int n=0;
int reco=0;
int min=INF;
while(!(m>=racimos && reco<necesatios)){
if(reco<necesatios){
reco+=vi[m];
if(reco>=necesatios) min=Math.min(min,reco);
m++;
}
else if(reco>necesatios){
reco-=vi[n];
if(reco>=necesatios) min=Math.min(min,reco);
n++;
}else{
break;
}
}
if(necesatios==0) System.out.println("0");
else if (min==INF) System.out.println("IMPOSIBLE");
else System.out.println(min);
st = new StringTokenizer(in.readLine()," ");
racimos = Integer.parseInt(st.nextToken());
necesatios = Integer.parseInt(st.nextToken());
}
}
}
Problema 141 Acepta el Reto - Paréntesis balanceados