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;
}

UVa - 850 - Crypt Kicker II

#include <iostream>
#include <algorithm>
#include <vector>
#include <stdlib.h>
//#include <fstream>
using namespace std;
string cad = "the quick brown fox jumps over the lazy dog";
int tamcad = cad.size();
int cantespacios = 0;
vector<int> lugares[100];
int tamlug=0;
char reemplazos['z'+1];
void cargar()
{
    cantespacios = count(cad.begin(),cad.end(),' ');
    tamcad = cad.size();
    bool contado[tamcad] ;
    for(int i = 0 ; i<tamcad; i++)contado[i] = false;
    for(int i = 0 ; i<tamcad ; i++)
        if(!contado[i])
        {
            contado[i] = true;
            lugares[tamlug].push_back(i);
            for(int j = i+1 ; j<tamcad; j++)
                if(cad[j]== cad[i])
                {
                    contado[j] = true;
                    lugares[tamlug].push_back(j);
                }
            tamlug++;
        }
}
bool esEncriptado(string candidato)
{

    int tam = candidato.size();
    if(tam != tamcad)
        return false;
    if(count(candidato.begin(),candidato.end(),' ') == cantespacios)
    {
        vector<int> lugarescandid[100];
        bool contado[tamcad];
        for(int i = 0 ; i<tamcad; i++)contado[i] = false;
        int tamlugcandi=0;
        for(int i = 0 ; i<tamcad ; i++)
            if(!contado[i])
            {
                contado[i] = true;
                lugarescandid[tamlugcandi].push_back(i);
                for(int j = i+1 ; j<tamcad; j++)
                    if(candidato[j]== candidato[i])
                    {
                        contado[j] = true;
                        lugarescandid[tamlugcandi].push_back(j);
                    }
                tamlugcandi++;
            }
        if(tamlugcandi!=tamlug)
            return false;
        for(int i = 0; i<tamlug ; i++)
        {
            if(lugares[i].size()!=lugarescandid[i].size())
                return false;
            for(int j = 0; j<lugares[i].size(); j++)
                if(lugares[i][j]!=lugarescandid[i][j])
                    return false;
            for(int j = 0; j<tamcad ; j++)
                reemplazos[candidato[j]] = cad[j];
            return true;
        }
    }
    return false;
}
int main()
{
    //ifstream fin("entrada.txt");
    //ofstream fout("salida.txt");
    cargar();
    int cantcasos;
    cin>> cantcasos;
    string linea;
    getline(cin,linea);
    getline(cin,linea);
    while(cantcasos--)
    {
        vector<string> conjunto;
        while(getline(cin,linea))
            if(linea.compare("")!=0)
                conjunto.push_back(linea);
            else
                break;
        bool sw = false;
        for(int i = 0 ; i<conjunto.size(); i++)
            if(esEncriptado(conjunto[i]))
            {
                sw = true;
                break;
            }
        //cout << "tamaño del conjunto = "<< conjunto.size()<<endl;
        if(sw)
        {
            for(int i = 0 ; i<conjunto.size(); i++)
            {
                //cout << "linea a reemplazar = "<< conjunto[i]<<endl;
                for(int j = 0 ; j<conjunto[i].size(); j++)
                    cout << reemplazos[conjunto[i][j]];
                cout <<""<< endl;
            }
        }
        else
            cout << "No solution."<<endl;
        if(cantcasos!=0)
            cout <<endl;
    }
    return 0;
}

jueves, 12 de abril de 2012

UVa - 10252 - Common Permutation

#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    string a,b,aux;
    int tama,tamb;
    while(getline(cin,a) && getline(cin,b))
    {
        tama = a.size();
        tamb = b.size();
        sort(a.begin(),a.end());
        sort(b.begin(),b.end());
        string sol = "";
        int i ,j = 0;
        for(i = 0; i<tama && j<tamb; i++)
            while(j<tamb && a[i]>=b[j])
            {
                if(b[j]==a[i])
                {
                    sol += a[i];
                    j++;
                    break;
                }
                j++;
            }
        cout << sol<<endl;
    }
    return 0;
}