BOOKSTORE 질문입니다

  • Aus
    Aus

    BOOKSTORE 질문입니다

    안녕하세요. 갓입문한 초보입니다. 다름이아니라 bookstore 이문제를 풀면서 계속 오답이 나와 게시판에 글을 올립니다..ㅠㅠ
    오답으로 나오는 이유가 제가 문제를 잘못이해한 것으로 판단됩니다.

    프로그램 작동 순서입니다
    1. tc를 입력받아 while문으로 i가 tc가될 때까지 반복합니다.

    1. N은 책의수, M은 서점의 수입니다. N,M까지 반복하여 배열에 저장합니다.
      gold에는 금액만, point에는 포인트만 저장합니다.(인덱스는 동일)
      책의 가격을 비교하는게 아니라 서점에서 모든책을 샀을 때의 최소 가격이 필요하므로
      gold[서점index][책금액index]
      point[서점index][point index] 로 저장하였습니다.

    2. N==1 일 때(사고자 하는 책이 한권인 경우 책의가격만 비교하여 가장 싼 책의 가격을 min[tc index]에 저장합니다.

    3. 그 외에는 point가 가장 많은 책순으로 정렬한 후 첫번째 책의 가격을 gold1변수에 넣습니다.
      point1변수에는 첫번째 책의 포인트를 -로 저장합니다.
      그 다음부터는 gold[j]1
      -point[j]0
      +gold[j]2
      -point[j]1 ....
      N(책의개수)-2 까지 반복하고 N-1일때는 책의금액만 point1변수에 더하며 이 때의 결과가 0보다 작다면(포인트가 책의 가격보다 커서 남는다면) point1변수에 0을 넣고 반복문을 종료합니다.

    4. price[j]=gold1(첫번째의 책금액)+point1(포인트를 쓰고 나머지의 책금액) (서점 당 최소가격을 넣습니다.)

    5. price[j]를 정렬하여 min[tc index] 에 저장합니다.

    6. tc까지의 반복이 모두 끝나면
      (입력이 모두 끝나고 각 테스트케이스마다 최소가격을 저장한상태)
      각 테스트케이스마다 최소가격을 출력합니다.
      .

    질문할 테스트 케이스입니다.
    1
    4 1
    50000 2000

    2000 1999

    4000 2001

    5000 2002

    54997

    이경우 책이 4개이며 서점이 한개입니다. 서점이 한개이므로 이 서점에서 모든책을 사야합니다.
    제일 싼경우는 5000원 4000원 50000원 2000원 책 순서로 사서
    5000+4000-2002+50000-2001+2000-2000 = 54997
    이란 최소가격이 나오는 것으로 생각됩니다..
    문제를 잘못이해하고있거나 알고리즘이 잘못되었다면
    지적부탁드립니다..


    1
    1 5
    1000 0 2000 1999 3000 2500 4000 2000 5000 200
    1000

    위의 경우 책이 1개이며 서점이 5개인 경우입니다. 책이 한개이므로 포인트는 영향을 받지 않으므로 1000 0의 서점이 책가격이 제일 저렴하므로 1000이 출력됩니다.


    검색한 테스트 케이스인데..
    3000/2900, 1000/900 입력으로 넣으면 3100이 나온다는 댓글을 보았습니다.
    2
    2 1
    3000 2900
    1000 900
    1 2
    3000 2900 1000 900
    3000
    1000

    이 두가지의 경우 제생각으로는 3000과 1000이 나오는게 맞..다고 생각됩니다만 답이 3100이라하여 문제를 잘못이해하고있다고 생각이 들어 게시판에 올립니다.


    1
    4 1
    8000 7900
    3000 2000

    2000 1000

    1000 500

    8000

    제 생각으로는 이 케이스의경우 8000이 맞다고 생각됩니다만
    책을 사야 포인트를 쓸 수 있다, 남는 포인트는 신경쓰지 않는다.
    라는 조건으로 8000원 책을 먼저사야 나머지책을 포인트로 구입하여 최소금액인 8000원이 나온다는 계산입니다.


    이상입니다..
    조언 부탁드리며 문제를 잘못이해하는 부분이 있다면 지적해주시길 바랍니다..
    (코드를 올려도 되나요? 가입한지 얼마안되어 기본지식이 없습니다.. )

    #include
    using namespace std;
    int main(void){
    int tc; //테스트 케이스
    int N,M,i,j,k,y; //서점의 수, 책의 수, 반복문 변수
    int gold[101][201],point[101][201]; //서점 100이하의 정수, 책 200이하의 정수, 책의가격, 포인트 배열
    int price[101]; //서점당 전체 책 가격
    int min[101]; //최소가격
    int tempmin=0; //포인트중 최소포인트 변수
    int gold1,point1;//temp변수
    i=0;

    cin>>tc;
    while(1){
        N=0;M=0;
        for(j=0;j<101;j++){
            for(k=0;k<201;k++){
                gold[j][k]=0;
            }
            price[j]=0;
        }
        tempmin=0;
        if(tc==i){
            break;
        }
        cin>>N;
        cin>>M;
    
        min[i]=0;
        for(j=0;j<N;j++){
            for(k=0;k<M;k++){
                cin>>gold[k][j];
                cin>>point[k][j];
    
            }
    
        }
        if(N==1){
            for(j=0;j<M;j++){
                if(j==0){
                    min[i]=gold[j][0];
                }
                else{
                    if(min[i]>gold[j][0]){
                        min[i]=gold[j][0];
                    }
                }
            }
    
        }
        else{
            for(j=0;j<M;j++){
                gold1=0;point1=0;
                for(k=0;k<N;k++){
                    for(y=k;y<N;y++){
                        if(point[j][k]<point[j][y]){
                            tempmin=point[j][y];
                            point[j][y]=point[j][k];
                            point[j][k]=tempmin;
                            tempmin=gold[j][y];
                            gold[j][y]=gold[j][k];
                            gold[j][k]=tempmin;
                        }
                    }
                }
    
    
                for(k=0;k<N;k++){
                    if(k==0){
                        gold1=gold[j][k];
                        point1=-point[j][k];
                    }
                    else if(k==(N-1)){
                        point1+=gold[j][k];
                        if(point1<0){
                            point1=0;
                        }
                    }
                    else{
                        point1+=(gold[j][k]-point[j][k]);
                    }
                }
                price[j]=gold1+point1;
    
    
                if(j==0){
                    min[i]=price[j];
    
                }
                else{
                    if(min[i]>price[j]){
                        min[i]=price[j];
                    }
    
                }
            }
        }
        i++;
    }
    
    
    for(i=0;i<tc;i++){
        printf("%d\n",min[i]);
    }
    return 0;

    }


    9년 전
2개의 댓글이 있습니다.
  • cubelover
    cubelover

    1
    3 1
    5 3
    4 2
    1 0

    이 경우 답은 6인데, Aus님의 알고리즘으로는 5가 나오네요.


    9년 전 link
  • Aus
    Aus

    아! 정말 감사합니다 이제알겠네요!


    9년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.