RATIO 문제 질문합니다.

  • dmatrix
    dmatrix

    문제

    안녕하세요? 도무지 해결방법이 떠오르지 않아서 질문을 드리게 되었습니다.

    두개의 서로 다른 접근법으로 코딩을 하였습니다.
    첫번째는 방정식으로 풀었고
    두번째는 재귀함수를 이용해서 풀었습니다..

    많은 테스트 케이스를 만들어서 테스트를 하였는데

    경기수 : 100
    이긴경기수 : 99

    이런 예제가 있을때, -1의 결과를 냅니다.
    분석을 해 보았더니 위의 경우 방정식 풀이법으로
    분모가 0이 되서 무한대가 되서 -1이 나오는 경우였습니다.

    그래서 재귀를 이용해서 풀었습니다.
    동일하게 -1의 결과를 내는데
    두번째 코드에서
    (gWinCount + count) / (gTotalCount + count) * 100)에 count를
    큰 수를 대입하면 출력시 100이 나옵니다.
    그러나 int로 케스팅을 하게 되면 99가 됩니다.
    100.0과 비교를 하더라도 다른값으로 인식하게 됩니다.

    아무리 고민해도 모르겠습니다.. ㅠㅠ
    제가 잘못 삽질하고 있는건지 고수분꼐 도움 요청드립니다.

    그래프를 봐도 해당 값은 극한값이라 -1을 출력하는게 맞는것 같은데
    그래프+%2F+(100+%2B+x))

    제가 어딜 놓치고 있는지 알려주셨으면 합니다.

    감사합니다.

    #include <iostream>
    using namespace std;
    
    class Record
    {
    public:
        Record(int playCount, int winCount)
            : mPlayCount(playCount)
            , mWinCount(winCount)
        {
        }
    
        int NeedWinGameForOnePercent()
        {
            double playCount = static_cast<double>(mPlayCount);
            double winCount = static_cast<double>(mWinCount);
            double winRate = winCount / playCount * 100;
            double needRate = 1 - (winRate - static_cast<int>(winRate));
            double needMoreGame = ((winRate + needRate) * playCount - 100 * winCount) / (100 - winRate - needRate);
    
            int game = Ceil(needMoreGame);
    
            if (0 < game && game <= 2000000000)
            {
                return game;
            }
            else
            {
                return -1;
            }
        }
    
    private:
        int Ceil(double value)
        {
            if (value > static_cast<int>(value))
            {
                return static_cast<int>(value)+1;
            }
            else
            {
                return static_cast<int>(value);
            }
        }
    
    private:
        int mPlayCount;
        int mWinCount;
    };
    
    
    int main(int argc, char* argv[])
    {
        int numOfCase = 0;
        cin >> numOfCase;
    
        for (int i = 0; i != numOfCase; ++i)
        {
            int playCount;
            cin >> playCount;
    
            int winCount;
            cin >> winCount;
    
            Record record(playCount, winCount);
            cout << record.NeedWinGameForOnePercent() << endl;
        }
    
        return 0;
    }
    
    #include <iostream>
    using namespace std;
    
    const int MIN_CONT_WIN_COUNT = 1;
    const int MAX_CONT_WIN_COUNT = 2000000000;
    
    double gTotalCount = 0.0;
    double gWinCount = 0.0;
    int gContWinCount = 0;
    
    void NeedGameForOnePercent(unsigned int min, unsigned int max)
    {
      if (min <= max)
      {
        unsigned int count = (min + max) / 2;
    
        if (static_cast<unsigned int>(gWinCount / gTotalCount * 100) <
            static_cast<unsigned int>((gWinCount + count) / (gTotalCount + count) * 100))
        {
          gContWinCount = count;
          return NeedGameForOnePercent(min, count - 1);
        }
        else
        {
          return NeedGameForOnePercent(count + 1, max);
        }
      }
    }
    
    int main(int argc, char* argv[])
    {
      int numOfGame = 0;
      cin >> numOfGame;
    
      for (int i = 0; i != numOfGame; ++i)
      {
        cin >> gTotalCount >> gWinCount;
        NeedGameForOnePercent(MIN_CONT_WIN_COUNT, MAX_CONT_WIN_COUNT);
    
        if (!gContWinCount)
        {
          cout << -1 << endl;
        }
        else
        {
          cout << gContWinCount << endl;
        }
    
        gContWinCount = 0;
      }
      return 0;
    }
    

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

    지금 승률이 99%면 무슨 일을 하더라도 100%로 올릴 수 없으니 답은 -1이 맞는데요. 문제는 다른 곳에 있는 게 아닐까요?


    9년 전 link
  • dmatrix
    dmatrix

    흠... 뭐가 잘못된걸까요.. 출력이 잘못된것도 아니고 ㅠㅠ


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