jueves, 7 de junio de 2012

king's poker ( me acepto pero .......... )

#include 
#include 
#include 
#include 
#include 
using namespace std;

int main()
{

    int ca1,ca2,ca3,extra,ele;

    scanf("%d%d%d",&ca1,&ca2,&ca3);
    while(ca1+ca2+ca3 != 0)
    {
        int sw =0; 
        if (ca1 == ca2)
        {
            ele = ca1;
            sw = 1 ;
            if(ca2==ca3)
            {
                ele = max(ele,ca3);
                sw =2;
            }
            else
            extra = ca3;
        }
        else
        {
            if (ca2 == ca3)
            {
                ele = ca3;
                sw =1;
                extra = ca1;
            }
            else
            {
                if(ca1 == ca3)
                {
                    ele = ca1;
                    sw = 1;
                    extra = ca2;
                }
            }
        }
        if (sw == 0)
        cout << "1 1 2" << endl;
        else
        {
            if (sw==2)
            {
                if (ele == 13)
                cout << "*" << endl;
                else
                {
                    ele++;
                    cout << ele << " "<< ele << " "<< ele<< endl;
                }
            }
            else
            {
                if ( ele == 13)
                {
                    if(extra == 13)
                    cout << "*" < ele)
                        cout << "1 1 1"<

martes, 29 de mayo de 2012

Problema E

Aqui les muestro una solucion de problema E del concurso, nostros no perdonamos

#include 
#include 
using namespace std;

int main()
{
    int n,pos,i;
    scanf("%d",&n);
    while(n!=0)
    {
        int pos[10001]={0};
        int num[10001]={0};
        for ( i = 1 ; i <= n ; i ++)
        scanf("%ld%ld",&num[i],&pos[i]);
        int c = 0;
        int p;
        for ( i = 1 ; i <= n ; i ++)
        {
                p = i+pos[i];
                if(p>n || p <1)
                c=c+1;
                else
                {
                    if(pos[i] != 0)
                    {
                        c = c +pos[i];
                        c = c+ pos[i+pos[i]];
                    }
                }
        }
        if (c == 0)
        {
        for ( i = 1 ; i <= n ; i ++)
        {
            if(pos[i]==0)
            g[i]=num[i];
            if(pos[i]>0)
            g[i+pos[i]]=num[i];
            if(pos[i]<0)
            g[i+pos[i]]=num[i];
        }

        for ( i = 1 ; i <= n ; i ++)
        {

            if(i==n)
            printf("%ld",g[i]);
            else
            printf("%ld ",g[i]);
        }
        printf("\n");

        }
        else
        {
            printf("-1\n");
        }

        scanf("%d",&n);
    }
    return 0;
}

sábado, 28 de abril de 2012

Coj - 1259

bueno al fin se me ocurrio la solucion de este problema
#include 
#include 
#include 
using namespace std;

int main()
{
    int n;
    cin >> n;
    int v[]={1,3,9,27,81,43,29,87,61,83,49,47,41,23,69,7,21,63,89,67};

    for(int i =0;i> num;
        int c = 0;
        int indice = 0;



        for (int j = num.size ()-1; j >= 0;j--)
        {

            c = c + v[indice]*((int)num[j]-48);

            indice ++;
            if(indice==19)
            indice =0;


        }


        if ( c % 4 ==0)
        cout << "YES"<< endl;
        else
        cout <<"NO" << endl;


    }


}

miércoles, 25 de abril de 2012

TSHOW2

Luego de investigar como loco Sucesión de Fibonacci  encontre en esta parte algo muy interesante Propiedades de la sucesión
El último dígito de cada número se repite periódicamente cada 60 números. Los dos últimos, cada 300; a partir de ahí, se repiten cada 15\times10^{n-1} números.
#include <iostream>
using namespace std;
int main(){
    long long int vec[63];
    long long int vec2[63];
    vec[1]=0;
    vec[2]=1;
    vec[3]=1;
    vec[4]=2;
    vec[5]=3;
    vec[6]=5;
    vec[7]=8;

    vec2[1]=0;
    vec2[2]=1;
    vec2[3]=1;
    vec2[4]=2;
    vec2[5]=3;
    vec2[6]=5;
    vec2[7]=8;
    for(int i=8; i<61; i++)
    {
        vec[i]=vec[i-2]+vec[i-1];
        vec2[i]=vec[i]%10;
    }
    long long int aux=1,aux2=1;
    int n;
    cin>>n;
    while(n--){
        cin>>aux;
        if(aux<7)
        {
            cout<<vec2[aux]<<endl;
        }
        else
        {
            aux2=aux%60;
            if(aux2==0)
                cout<<1<<endl;
            else
                cout<<vec2[aux2]<<endl;
        }
    }
    return 0;
}

Moraleja revisar las propiedades, si hubiera hecho antes eso me hubiera ahorrado mucho tiempo :xD.

jueves, 19 de abril de 2012

Burrito Amarrado

Problema B  Burrito amarrado

Entrada: burrito.in 
Salida: estándar.
Máxima memoria: 32 MB
Tiempo límite: 10 segundos 
Descripción

 Un burro se encuentra en un corral circular de radio R amarrado con una cuerda mágica a un poste situado en el centro del corral. Inicialmente el burro se encuentra junto al poste y comienza a caminar hacia el norte. La cuerda se pone tensa cuando el burro llega a la mitad del camino entre el poste y el corral. En ese momento el burro da vuelta 90º a la derecha y sigue caminando. De nuevo, la cuerda mágica únicamente le permite llegar hasta la mitad del camino entre el punto donde dio vuelta y el corral. Como el burro quiere escapar, continúa caminando de esta manera hasta que por n-ésima vez la cuerda lo obliga a detenerse. Tu trabajo es determinar la distancia entre el burro y el poste en ese momento. 

Entrada

 Cada caso de entrada consiste de una línea que contiene dos enteros R y n separados por un espacio (1 ≤ R, n ≤ 10000). La última línea de la entrada contiene dos ceros, ese caso no debe procesarse. 

Salida

 Para cada caso de entrada, imprime una línea que contenga la distancia entre el burro y el poste con 2 decimales de precisión.

Ejemplo de entrada
 
120 1
120 4
0 0

Ejemplo de salida
 
60.00
40.69


Solucion

Bueno en este problema se soluciona teniendo en cuenta que habran cuatro casos ya que gira en 0, 90 , 180 , 270 grados. 

El valor de X y de Y se altera sumando o restan la distancia del punto actual al corral de esta manera 

y = (y +  sqrt(r*r-x*x))/2;
 x = (x +  sqrt(r*r-y*y))/2;
 y = (y -  sqrt(r*r-x*x))/2;
 x = (x -  sqrt(r*r-y*y))/2;

de acuerdo a los cuatro casos y a los signos en ellos.
finalmente 
se usa el teorema de pitagoras para mostrar
la hipotenusa.


#include 
#include 
#include 
using namespace std;

int main()
{
    int r;
    int n;
    cin >> r;
    cin >> n;
    while(r+n!=0 )
    {

        double x=0.0;
        double y=0.0;
        while(n--)
        {
            if (n%4==1) y = (y +  sqrt(r*r-x*x))/2;
            if (n%4==2) x = (x +  sqrt(r*r-y*y))/2;
            if (n%4==3) y = (y -  sqrt(r*r-x*x))/2;
            if (n%4==0) x = (x -  sqrt(r*r-y*y))/2;

        }
        cout.precision(2);

        cout << fixed << sqrt(x*x+y*y) <> r;
        cin >> n;

    }

}

domingo, 15 de abril de 2012

UVa - 10132 - File Fragmentation

#include <iostream>
#include <stdlib.h>
#include <vector>
using namespace std;

int main()
{
    int nroCasos ;
    string linea;

    getline(cin,linea);
    nroCasos = atoi(linea.data());
    getline(cin,linea);
    while(nroCasos--)
    {
        int totalLetras = 0 ;
        vector<string> datos;
        while(getline(cin,linea) && !linea.empty())
        {
            totalLetras += linea.size();
            datos.push_back(linea);
        }
        int tamdatos = datos.size();

        int longitudSol = totalLetras/(tamdatos/2);

        //fout << "POSIBLES SOLUCIONES"<<endl;
        vector<string> solucion;
        for(int i = 0; i<tamdatos; i++)
            for(int j = i+1; j < tamdatos; j++)
                if(datos[i].size()+datos[j].size() == longitudSol)
                    solucion.push_back(datos[i]+datos[j]),solucion.push_back(datos[j]+datos[i]);

        tamdatos = solucion.size();
        int marcas[tamdatos];
        for(int i = 0; i<tamdatos; i++)
            marcas[i] = 0;
        string sol ;
        int may = -1 ;
        for(int i = 0; i<tamdatos; i++)
            if(marcas[i]==0)
            {
                for(int j = i; j < tamdatos; j++)
                    if(solucion[i].compare(solucion[j])==0)
                        marcas[j]=1, marcas[i]++;

                if(marcas[i]>may)
                    may = marcas[i],sol =  solucion[i];
            }
        cout<<sol<<endl;
        if(nroCasos!=0)
            cout<<endl;
    }
    return 0;
}

UVa - 10188 - Automated Judge Script

#include <iostream>
#include <algorithm>
#include <ctype.h>
using namespace std;
string soloNumeros(string cad)
{
    string sol = "";
    for(int i = 0; i < cad.size(); i++)
        if(isdigit(cad[i]))
            sol+=cad[i];
    return sol;
}
int main(int argc, char *argv[])
{
    int a,b;
    int nrocaso = 1;
    string linea;
    while(getline(cin,linea))
    {
        a = atoi(linea.data());
        if(a == 0)
            return 0;
        string cadsA="";
        for(int i = 0 ; i<a; i++)
        {
            getline(cin,linea);
            cadsA +=linea+'\n';
        }
        getline(cin,linea);
        b = atoi(linea.data());
        string cadsB="";
        for(int i = 0 ; i<b; i++)
        {
            getline(cin,linea);
            cadsB += linea+'\n';
        }
        cout<< "Run #"<<nrocaso<<": ";
        if(cadsA.compare(cadsB) == 0)
            cout << "Accepted"<<endl;
        else{
            string numsA,numsB;
            numsA = soloNumeros(cadsA);
            numsB = soloNumeros(cadsB);
            if(numsA.compare(numsB)==0)
                cout << "Presentation Error"<<endl;
            else
                cout<< "Wrong Answer"<<endl;
        }
        nrocaso++;
    }
    return 0;
}