lunes, 18 de junio de 2012

Problema de esta semana: COJ 1500 an express taxi

Descripción

In a long street the traffic of express taxies is organized in the following way: There is a taxi stop every one kilometer. An express taxi drives along the street from each stop 1, 2, 3, ... or 10 kilometers without a stop. For each of the ten distances a separate price is fixed and marked in the table, e.g. 1 12 2 21 3 31 4 40 5 49 6 58 7 69 8 79 9 90 10 101 A passenger wants to travel n (1 <= n <= 100) kilometers. Can you write a program to helping on that. Which driving distances does the passenger have to choose so that the journey would be the cheapest, and what is the total price of the journey.

Especificación de entrada

The input has two lines. The first line contains ten space separated integer numbers which are prices for driving 1, 2, 3, ... , 10 kilometers. The last line contains the number of kilometers (n) which the passenger has to travel.

Especificación de salida

Each line except the last one should contain two numbers which are the length of the route and the price of the ticket. The total price of the journey should be written in the last line of the output. If several solutions are possible, choose one of them where tickets (in ascending ordered by the distance) are minimum.

Ejemplo de entrada

12 21 31 40 49 58 69 79 90 101
15

Ejemplo de salida

3 31
6 58
6 58
147

7 comentarios:

  1. hola, el codigo no es aseptado, una idea de porque esta mal.

    #include
    #include
    #include


    int main(){

    int pre[2][10],z,n,j,m,i,k,b;
    int dis[100],are[2][17];
    int s,sum;
    int n1,n2,n3,n4,n5,n6,n7,n8,n9,n10;


    pre[0][0]=2;
    pre[0][1]=1;
    pre[0][2]=1;
    pre[0][3]=0;
    pre[0][4]=-1;
    pre[0][5]=-2;
    pre[0][6]=-1;
    pre[0][7]=-1;
    pre[0][8]=0;
    pre[0][9]=1;




    scanf("%d %d %d %d %d %d %d %d %d %d",&n1,&n2,&n3,&n4,&n5,&n6,&n7,&n8,&n9,&n10);

    pre[1][0]=n1;
    pre[1][1]=n2;
    pre[1][2]=n3;
    pre[1][3]=n4;
    pre[1][4]=n5;
    pre[1][5]=n6;
    pre[1][6]=n7;
    pre[1][7]=n8;
    pre[1][8]=n9;
    pre[1][9]=n10;




    for(i=0;i<10;i++){

    pre[1][i]= pre[1][i]+pre[0][i];
    }



    scanf("%d",&n);
    m=n;


    if(n%6==0){
    s=n/6;
    for(i=0;i7){
    j=0;
    while(m>6){
    m=m-6;
    dis[j++]=m;
    k=j;
    }
    }

    b=n-k*6;
    dis[k+1]=b;
    i=0;
    j=0;
    for(i=0;i<k;i++){
    are[0][i]=6;

    }
    are[1][5]=pre[1][5];
    for(i=0;i<k;i++){
    printf("\n%d %d", are[0][i],are[1][5]);
    }
    printf("\n%d %d", b ,pre[1][b-1]);

    sum=(k*pre[1][5]+pre[1][b-1]);
    printf("\n%d",sum);
    }

    ResponderEliminar
  2. No me queda muy claro lo que haces, puedes agregar comentarios a tu codigo para ver que haces en cada paso?

    observaciones:
    que asignas a pre[0][i]?
    En realidad no necesitas los n(i)'s, puedes leer directamente como pre[1][i].
    En el segundo for no especificas donde termina o como aumenta.

    ResponderEliminar
  3. Les dejo mi codigo, pero cuando lo corro deja de funcionar. Supongo que hay un error de escritura que no he visto.

    #include
    long a[101][56],i,j,k,p,o,m,n;

    int main(){
    for(i=1;i<11;i++)
    scanf("%ld",a[i][0]);//a[i][0]=cuanto cuesta viajar un km

    scanf("%ld",&n);

    if(a[1][0]<=a[2][0]/2&&a[1][0]<=a[3][0]/3&&a[1][0]<=a[4][0]/4&&a[1][0]<=a[5][0]/5&&a[1][0]<=a[6][0]/6&&a[1][0]<=a[7][0]/7&&a[1][0]<=a[8][0]/8&&a[1][0]<=a[9][0]/9){
    //si viajar por kilometro es lo mas eficiente ya acabe
    for(i=1;ii;k--)
    a[n][k]=a[n][k-1];
    a[n][i]=o;
    continue;
    }
    }
    }

    for(i=1;i<a[n][55]+1;i++){
    printf("%ld %ld\n",a[n][i],a[(a[n][i])][0]);
    }

    printf("%ld",a[n][54]);

    }
    }

    ResponderEliminar
  4. Creo que sus códigos no se copiaron bien en los comentarios... En algunas partes donde iba un < o un > el código no se copió. Creo que eso pasó porque esos caracteres en HTML son palabras reservadas, así que deben escribirse con sus correspondientes secuencias de escape. Pueden ver cómo hacerlo en el siguiente link.

    http://ininweb.uprm.edu/william/w_h/HTMLesp.htm#ES

    En caso de que no funcione, pueden enviarme sus códigos por correo para que los revise.

    ResponderEliminar
  5. MI codigo ya funciona con todos los casos que se me han ocurrido, pero no me lo aceptan en la pagina del caribbean online judge:

    #include stdio.h
    long a[101][56],i,j,k,p,o,m,n;

    int main(){
    for(i=1;i<11;i++)
    scanf("%ld",&a[i][0]);//a[i][0]=cuanto cuesta viajar un km

    scanf("%ld",&n);

    if(a[1][0]<=a[2][0]/2&&a[1][0]<=a[3][0]/3&&a[1][0]<=a[4][0]/4&&a[1][0]<=a[5][0]/5&&a[1][0]<=a[6][0]/6&&a[1][0]<=a[7][0]/7&&a[1][0]<=a[8][0]/8&&a[1][0]<=a[9][0]/9&&a[1][0]<=a[10][0]/10){
    //si viajar por kilometro es lo mas eficiente ya acabe
    for(i=1;i<=n;i++)
    printf("1 %ld\n",a[1][0]);
    printf("%ld",n*a[1][0]);
    }else{

    a[1][55]=1;//a[i][55]=cuantos taxis debo tomar para encontrar la manera eficiente
    a[1][54]=a[1][0];//a[i][54]=menor costo posible
    a[1][1]=1;
    //printf("1 %ld\n",a[1][54]);

    for(j=2;j<11;j++){
    //printf("%ld\n",j);
    a[j][54]=a[j][0];
    m=0;
    for(i=1;ii;k--)
    a[n][k]=a[n][k-1];
    a[n][i]=o;
    continue;
    }
    }
    }

    for(i=1;i<=a[n][55];i++){
    printf("%ld %ld\n",a[n][i],a[(a[n][i])][0]);
    }

    printf("%ld",a[n][54]);

    }
    }

    ResponderEliminar
  6. Ya me aceptaron el codigo, el problema era que no consideraba que debian usarse la menor cantidad de taxis.

    #include << stdio. h>>
    long long a[101][56],i,j,k,p,o,m,n;

    int main(){
    for(i=1;i << 11;i++)
    scanf("%lld",&a[i][0]);//a[i][0]=cuanto cuesta viajar un km

    scanf("%lld",&n);

    if(a[1][0] <i;k--)
    a[n][k]=a[n][k-1];
    a[n][i]=o;
    continue;
    }
    }
    }

    for(i=1;i <<=a[n][55];i++){
    printf("%lld %lld\n",a[n][i],a[(a[n][i])][0]);
    }

    printf("%lld",a[n][54]);

    }
    }

    ResponderEliminar