Jump to content

Greedy Gift Givers


polska
 Share

Recommended Posts

Boas pessoal, estive a fazer o programa Greedy Gift Givers da USACO e ao submeter, diz-me que falhou num caso de teste, o que eu acho estranho, é o meu output estar igual ao deles... E deu incorrecto..

Run 1: Execution error: Your program did not produce an answer
 that was judged as correct. The program stopped at 0.000 seconds;
 it used 3336 KB of memory.
 Here are the respective outputs:
 ----- our output ---------
 mitnik_2923
 Poulsen_557
 Tanner_128
 Stallman_-311
 Ritchie_-1777
 Baran_245
 Spafford_-1997
 Farmer_440
 Venema_391
 Linus_-599
 ---- your output ---------
 mitnik
 2923
 Poulsen
 557
 Tanner
 128
 Stallman
 -311
 Ritchie
 -1777
 Baran
 245
 Spafford
 -1997
 Farmer
 440
 Venema
 391
 Linus
 -599
 --------------------------
 ------ Data for Run 1 ------
 10
 mitnik
 Poulsen
 Tanner
 Stallman
 Ritchie
 Baran
 Spafford
 Farmer
 Venema
 Linus
 mitnik
 300 3
 Poulsen
 Tanner
 Baran
 Poulsen
 1000 1
 Tanner
 Spafford
 2000 9
 mitnik
 Poulsen
 Tanner
 Stallman
 Ritchie
 Baran
 Farmer
 Venema
 Linus
 Tanner
 ... [and more] ...
 ----------------------------

Eu fui ao visual studio verficar se dava algum erro ou se o output dava realmente mal mas não, correu sempre bem...

Alguém me consegue ajudar?

Meu cód:

#include <stdio.h>
#include <string.h>
struct problema {
char nome[14+1];
int dinheiro;
};
struct problema pessoas[10];
int main(){
FILE *in=fopen("gift1.in","r"),*out=fopen("gift1.out","w");
int numero_pessoas,numero_receivers,dinheiro,resto,posGiver;
char giver[14+1],receiver[14+1];
/* receber numero de pessoas */
fscanf(in,"%d",&numero_pessoas);
/* receber nomes das pessoas e colocar na struct */
for(int i=0;i<numero_pessoas;i++){
fscanf(in,"%s",pessoas[i].nome);
pessoas[i].dinheiro=0; //colocar todo o valor de dinheiro a 0
}
/* receber nome dos givers(doadores),a sua quantia de dinheiro e o numero de pessoas que iram receber o dinheiro */
for(int i=0;i<numero_pessoas;i++){
fscanf(in,"%s",giver);
fscanf(in,"%d %d",&dinheiro,&numero_receivers);
if(numero_receivers!=0){ //se o valor for 0 não existem receivers
/* receber nome dos receivers */
for(int j=0;j<numero_receivers;j++){
 fscanf(in,"%s",receiver);
 /* pesquisa receiver e giver e guarda a posição do giver para atualizar depois o dinheiro */
 for(int i=0;i<numero_pessoas;i++){
 if(strcmp(pessoas[i].nome,receiver)==0)
 pessoas[i].dinheiro+=dinheiro/numero_receivers; //atualiza dinheiro receiver
 if(strcmp(pessoas[i].nome,giver)==0)
 posGiver=i; //guarda posição do giver
 }
}
/* actualiza dinheiro do giver */
resto=(dinheiro/numero_receivers)*numero_receivers; //como é divisão inteira, pode sobrar algum dinheiro, que fica com o giver
resto=dinheiro-resto;
dinheiro-=resto;
pessoas[posGiver].dinheiro-=dinheiro;
}
}
fclose(in);

/* mostra dinheiro de cada pessoa */
for(int i=0;i<numero_pessoas;i++){
fprintf(out,"%s\n%d\n",pessoas[i].nome,pessoas[i].dinheiro);
}
fclose(out);
return 0;
}
Edited by polska

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Link to comment
Share on other sites

Ele deve comparar o texto do output. Como o teu tem os \n entre os nomes e os valores, é considerado diferente... presumo eu

Põe o printf assim:

fprintf(out,"%s_%d\n",pessoas[i].nome,pessoas[i].dinheiro);
Edited by Flinger
Link to comment
Share on other sites

Ele deve comparar o texto do output. Como o teu tem os \n entre os nomes e os valores, é considerado diferente... presumo eu

Põe o printf assim:

fprintf(out,"%s_%d\n",pessoas[i].nome,pessoas[i].dinheiro);

Eu já tinha tentado isso, mas não funcionou, dá exactamente a mesma coisa que pus la em cima.

EDIT : Já resolvi, realmente o erro era no texto de output, não devia levar um '_' mas sim um espaço.. Foi erro meu que pensava que era \n xD...

Tópico resolvido

Edited by polska

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Link to comment
Share on other sites

Os resultados parecem correctos. Só se for mesmo alguma questão relacionada com formatações (End of line ou qq coisa do género)

Sem ver o enunciado, não posso dizer mais nada.

Já esta resolvido 👍 , eu editei a menssagem a que te respondi..

Obrigado

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.