Ir para o conteúdo
• Revista PROGRAMAR: Já está disponível a edição #57 da revista programar. Faz já o download aqui!

[Problema] USACO

Tharis    3

Estou no exercício 2 da secção 1.1, o problema é este:

It is a well-known fact that behind every good comet is a UFO. These UFOs often come to collect loyal supporters from here on Earth. Unfortunately, they only have room to pick up one group of followers on each trip. They do, however, let the groups know ahead of time which will be picked up for each comet by a clever scheme: they pick a name for the comet which, along with the name of the group, can be used to determine if it is a particular group's turn to go (who do you think names the comets?). The details of the matching scheme are given below; your job is to write a program which takes the names of a group and a comet and then determines whether the group should go with the UFO behind that comet.

Both the name of the group and the name of the comet are converted into a number in the following manner: the final number is just the product of all the letters in the name, where "A" is 1 and "Z" is 26. For instance, the group "USACO" would be 21 * 19 * 1 * 3 * 15 = 17955. If the group's number mod 47 is the same as the comet's number mod 47, then you need to tell the group to get ready! (Remember that "a mod b" is the remainder left over after dividing a by b; 34 mod 10 is 4.)

Write a program which reads in the name of the comet and the name of the group and figures out whether according to the above scheme the names are a match, printing "GO" if they match and "STAY" if not. The names of the groups and the comets will be a string of capital letters with no spaces or punctuation, up to 6 characters long.

Examples:

Input Output

COMETQ

HVNGAT  GO

ABSTAR

USACO    STAY

PROGRAM NAME: ride

INPUT FORMAT

Line 1: An upper case character string of length 1..6 that is the name of the comet.

Line 2: An upper case character string of length 1..6 that is the name of the group.

NOTE: The input file has a newline at the end of each line but does not have a "return". Sometimes, programmers code for the Windows paradigm of "return" followed by "newline"; don't do that! Use simple input routines like "readln" (for Pascal) and, for C/C++, "fscanf" and "fid>>string".

SAMPLE INPUT (file ride.in)

COMETQ

HVNGAT

OUTPUT FORMAT

A single line containing either the word "GO" or the word "STAY".

SAMPLE OUTPUT (file ride.out)

GO

O meu código é este:

```/*
ID: tharis21
LANG: C
*/
#include <stdio.h>
#include <ctype.h>

int numero(caracter)
{
if(isalpha(caracter)) { return ((int)caracter)-64;}
else { return 1;}
}

main () {
FILE *fin  = fopen ("ride.in", "r");
FILE *fout = fopen ("ride.out", "w");
char name_comet[6];
char name_group[6];
int pos,produto_group=1,produto_comet=1;

fscanf (fin, "%s",&name_comet[0]);
fscanf (fin, "%s",&name_group[0]);

for (pos=0;pos<6;pos++)
{
produto_comet*=numero(name_comet[pos]);
produto_group*=numero(name_group[pos]);
}

if (produto_comet%47 == produto_group%47)
{
fprintf (fout, "GO\n");
}

if (produto_comet%47 != produto_group%47)
{
fprintf (fout, "STAY\n");
}

exit (0);
}
```

Dá-me este erro:

LANG: C

Compiling...

Compile: OK

Executing...

> Run 1:

was judged as correct. The program stopped at 0.004 seconds.

Here are the respective outputs:

----- our output ---------

GO

STAY

--------------------------

------ Data for Run 1 ------

COMETQ

HVNGAT

----------------------------

Alguém me pode ajudar? O que é que está mal no código?

Cumps

tharis20

Partilhar esta mensagem

Partilhar noutros sites
Triton    12

Atenção que os nomes do cometa e do grupo não são necessariamente iguais, logo tens de fazer um loop para cada um.

Aqui tens o código corrigido, acho que não me enganei. Não continues o treino sem perceber os erros do teu código, pois tinhas várias erros na leitura e no resto do programa. Aliás, devias re-escrever o código e resolver de novo o problema, pois se não ficares a entender o mais básico de C, vai ser impossível continuar para problemas mais interessantes.

```#include <stdio.h>
#include <string.h>

#define MAX 7

int main(void)
{

FILE *fin  = fopen ("ride.in", "r");
FILE *fout = fopen ("ride.out", "w");

char ncomet[MAX];
char ngroup[MAX];
unsigned int pos, sgroup, scomet;
sgroup = scomet = 1;

/* o nome de um vector de chars	e um

fscanf (fin, "%s", ncomet);
fscanf (fin, "%s", ngroup);

for (pos=0;pos<strlen(ncomet);pos++)
{
scomet *= (int) ncomet[pos]-64;
}

for (pos=0;pos<strlen(ngroup);pos++)
{
sgroup *= (int) ngroup[pos]-64;
}

if ((scomet % 47) == (sgroup % 47))
{
fprintf (fout, "GO\n");
} else {
fprintf (fout, "STAY\n");
}

return 0;
}```

Partilhar esta mensagem

Partilhar noutros sites
Tharis    3

Thank You TRITON!

Vou analisar a correcção e depois já ponho questões (se as tiver).

Outra coisa, o que acham deste livro?

Edit: Se quiserem dar uma olhadela mandem-me uma PM para eu vos dar o link que é -> ilegal

Cumps

Partilhar esta mensagem

Partilhar noutros sites
Triton    12

Outra coisa, o que acham deste livro?

Podes encontrá-lo na internet só para analizar, mas pelo que li no sumário da Amazon tem grande parte dos algoritmos que precisas para resolver problemas de algoritmia. Só para teres uma ideia hoje no estágio aprendemos hash tables e grafos.

Partilhar esta mensagem

Partilhar noutros sites
Tharis    3

Eu encontrei o na Amazon, depois usei o ShareMiner e saquei. O que eu queria saber era o que é que vocês acham dele. Pelo (pouco) que percebi do teu post, achas que é bom (corrige-me se estiver enganado).

Edit: Acabei de analisar o teu código e tenho 1 (só! ) dúvida:

-

#define MAX 7
significa que o máximo do vector é 7 inclusivé?

Cumps

tharis20

Partilhar esta mensagem

Partilhar noutros sites
pcaldeira    0

Significa que o compilador vai substituir todas as ocorrências da palavra MAX por 7... ou seja, neste caso é como declarares uma variável com o nome max e o valor 7, mas usando o define podes fazer o compilador substituir qualquer coisa (por isso é que o #define é muito usado).

Partilhar esta mensagem

Partilhar noutros sites
Tharis    3

Eu sei isso... Quero é saber se na array, o [7] tb conta como espaço de armazenamento.

Partilhar esta mensagem

Partilhar noutros sites
pcaldeira    0

Não, a array fica com as "casas" de zero a seis, é o mesmo que declarares um vector array[7], porque no código está array[MAX] e o compilador substitui MAX por 7.

Partilhar esta mensagem

Partilhar noutros sites
Warrior    68

Programming Challenges

Steven S. Skiena, Miguel Revilla

Um livro escrito dedicado a concursos, se queres um livro para isso, este é provavelmente o melhor.

Mas o caminho no USACO, apesar de ser o mais longo, é sem dúvida alguma o melhor.

Se precisares de ajuda, já vou na secção 4.1 portanto tenho a resolução de todos esses problemas.

Partilhar esta mensagem

Partilhar noutros sites
nDray    1

Significa que o compilador vai substituir ...

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×