Jump to content
Sign in to follow this  
xtrm0

Mixing milk #76

Recommended Posts

xtrm0

Olá. Estava a resolver os exercicios do Usaco, e tentei resolver o Mixing milk  #76 (http://ace.delos.com/usacoprob2?a=2GI2RM7QTeM&S=milk).

Consegui fazer um codigo que deveria funcionar(nao apresenta erros no compilador, e erra a fazer uma operacao elementar: cin), mas que aparentemente inicia um loop infinito quando está a fazer cin. WTF?

/*
ID: afonso.3
PROG: milk
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

int main() {
//    freopen("milk.in","r",stdin);
//  freopen("milk.out","w",stdout);
    int N=0, M=0;
    vector <int> Di;
    vector <int> Li;
    int lc=0, dg=0;
    int tmp;
    cin >> N;
    cin >> M;
cout << "ola1";
    for (int i=0; i<M; i++) {
        cin >> tmp;
        Di.push_back(tmp);
        cin >> tmp;
        Li.push_back(tmp);
    }

cout << "OLA";

    for (int j=1; j<M; j++) {
        int chave=Di[j];
        int chave2=Li[j];
        int a=j-1;
        while (a>=0 && Di[a]>chave) {
            Di[a+1] = Di[a];
            Li[a+1] = Di[a];
            a--;
        }
        Di[a+1]=chave;
        Li[a+1]=chave2;
    }

    int x=0;
    while(lc<N) {
        if (Li[x]>0) {
            Li[x]--;
            lc++;
            dg+=Di[x];
        }
    }
    cout << dg << endl;
    return 0;
}

Neste paragrafo o codigo entra num ciclo infinito. (visto que na consola aparece ola1, mas nao OLA):

    
    for (int i=0; i<M; i++) {
        cin >>tmp;
        Di.push_back(tmp);
        cin >>tmp;
        Li.push_back(tmp);
    }

Para testar no meu pc usei o input de teste:

100 5

5 20

9 40

3 10

8 80

6 30

Alguma ideia de qual o erro, ou se é um bug do compilador?

EDIT: com pequenos bocados de imput(como 100 2 10 20 10 20) funciona perfeitamente.


<Signature goes here>

Share this post


Link to post
Share on other sites
Cynary

O erro é mais esquisito do que pensas  😲

O teu programa sai do loop, e depois fica preso no outro loop, que desenvolveste para resolução do problema ... aí é que tens problemas :P

No entanto, o estranho é que, apesar de passar por essa linha, ele não chega a imprimir o OLA 😲

Não faz sentido, mas ele passa por essa linha de código sem fazer nada. O que parece provocar com que ele faça alguma coisa é adicionar um << endl ...

Ficando assim o código:

/*
ID: afonso.3
PROG: milk
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

int main() {
//    freopen("milk.in","r",stdin);
//  freopen("milk.out","w",stdout);
    int N=0, M=0;
    vector <int> Di;
    vector <int> Li;
    int lc=0, dg=0;
    int tmp;
    cin >> N;
    cin >> M;
cout << "ola1";
    for (int i=0; i<M; i++) {
        cin >> tmp;
        Di.push_back(tmp);
        cin >> tmp;
        Li.push_back(tmp);
    }

cout << "OLA" << endl;

    for (int j=1; j<M; j++) {
        int chave=Di[j];
        int chave2=Li[j];
        int a=j-1;
        while (a>=0 && Di[a]>chave) {
            Di[a+1] = Di[a];
            Li[a+1] = Di[a];
            a--;
        }
        Di[a+1]=chave;
        Li[a+1]=chave2;
    }

    int x=0;
    while(lc<N) {
        if (Li[x]>0) {
            Li[x]--;
            lc++;
            dg+=Di[x];
        }
    }
    cout << dg << endl;
    return 0;
}

No entanto o problema principal mantém-se: a tua resolução entra num loop infinito.

EDIT: O teu loop infinito está aqui:

    int x=0;
    while(lc<N) {
        if (Li[x]>0) {
            Li[x]--;
            lc++;
            dg+=Di[x];
        }
    }

Share this post


Link to post
Share on other sites
jpaulino

"wtf" não é titulo nenhum.

Ou colocam titulos sugestivos do problema ou temos de começar a bloquear tópicos!

Share this post


Link to post
Share on other sites
xtrm0

Obrigado Cynary. Esquecime de meter x++  😳;

O codigo que fiz o upload esta aqui:

/*
ID: afonso.3
PROG: milk
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

int main() {
    freopen("milk.in","r",stdin);
    freopen("milk.out","w",stdout);
    int N=0, M=0;
    vector <int> Di;
    vector <int> Li;
    int lc=0, dg=0;
    int tmp;
    cin >> N;
    cin >> M;

    for (int i=0; i<M; i++) {
        cin >> tmp;
        Di.push_back(tmp);
        cin >> tmp;
        Li.push_back(tmp);
    }


    for (int j=1; j<M; j++) {
        int chave=Di[j];
        int chave2=Li[j];
        int a=j-1;
        while (a>=0 && Di[a]>chave) {
            Di[a+1] = Di[a];
            Li[a+1] = Li[a];
            a--;
        }
        Di[a+1]=chave;
        Li[a+1]=chave2;
    }

    int x=0;
    while(lc<N) {
        if (Li[x]>0) {
            Li[x]--;
            lc++;
            dg+=Di[x];
        } else {x++;}
    }
    cout << dg << endl;
    return 0;
}

Desculpe jpaulino :P .

Btw: Porque é que sem o endl não é imprimido nada?

Cumprimentos


<Signature goes here>

Share this post


Link to post
Share on other sites
Triton

Porque as consolas normalmente fazem buffer do output e só quando se faz flush do stream é que mostram. Uma maneira de forçar um flush do stream é normalmente uma nova linha.


<3 life

Share this post


Link to post
Share on other sites
daj

O que acontece é que o stdout é line-buffered, ou seja, o seu conteúdo só é flushed quando encontra um \n ou quando o buffer fica cheio.

Já agora, para completar, também é flushed quando é feita uma leitura para a qual não existem dados no buffer.

Share this post


Link to post
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
Sign in to follow this  

×
×
  • 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.