MATCHORDER 문제 질문 합니다.

  • User Avatar
    anypro12

    MATCHORDER 문제 질문 합니다.
    JM책에 있는 소스코드를 그대로 답안제출을 했는데
    왜 안되는건가요??
    JM책에 있는 소스코드가 잘못된건가요??
    테스트를 해보려고 제출을 시도해보았는데
    시간초과라고 뜹니다.
    왜그러는지 알려주세용~
    혹시 코드가 잘못된거라면 제대로된 코드 부탁드립니다.
    코드는


    ~~~ c++
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    using namespace std;

    int brute(const vector& russian, vector korean) {
    sort(korean.begin(), korean.end());
    int ret = 0;
    do {
    int wins = 0;
    for(int i = 0; i < korean.size(); i++)
    if(korean[i] >= russian[i])
    ++wins;
    ret = max(wins, ret);
    } while(next_permutation(korean.begin(), korean.end()));
    return ret;
    }

    int greedy(const vector& russian, vector korean) {
    int n = russian.size();
    vector taken(n, false);
    sort(korean.begin(), korean.end(), greater());
    int ret = 0;
    for(int kor = 0; kor < n; kor++) {
    int opponent = -1;
    for(int rus = 0; rus < n; rus++)
    if(!taken[rus] && russian[rus] <= korean[kor] &&
    (opponent == -1 || russian[opponent] <= russian[rus]))
    opponent = rus;
    if(opponent == -1) break;
    ++ret;
    taken[opponent] = true;
    }
    return ret;
    }

    int greedy2(const vector& russian, const vector& korean) {
    int n = russian.size(), wins = 0;
    // 아직 남아 있는 선수들의 레이팅
    multiset ratings(korean.begin(), korean.end());
    for(int rus = 0; rus < n; rus++) {
    // 가장 레이팅이 높은 한국 선수가 이길 수 없는 경우 가장 레이팅이 낮은 선수와 경기시킨다.
    if(*ratings.rbegin() < russian[rus])
    ratings.erase(ratings.begin());
    // 그 외의 경우 이길 수 있는 선수 중 가장 레이팅이 낮은 선수와 경기시킨다.
    else {
    ratings.erase(ratings.lower_bound(russian[rus]));
    ++wins;
    }
    }
    return wins;
    }

    int main() {
    int iter = 0;
    while(true) {
    int n = rand() % 8 + 1;

        vector<int> rus(n), kor(n);
        for(int i = 0; i < n; i++) {
            rus[i] = rand() % 3000;
            kor[i] = rand() % 3000;
        }
        assert(brute(rus, kor) == greedy(rus, kor));
        assert(greedy(rus, kor) == greedy2(rus, kor));
        if(++iter % 1000 == 0) printf("%d ..\n", iter);
    }
    

    }

    </spoiler>
    

    12년 전
1개의 댓글이 있습니다.
  • User Avatar
    JongMan

    코드를 읽어보세요. 제출하신 소스 코드는 문제를 해결하는 것이 아니라 정답을 그리디 알고리즘과 비교하는 코드입니다. greedy() 함수는 그대로 쓰셔야 하지만 입출력은 별도로 작성하셔야 합니다.


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