MATCHORDER 문제 질문 합니다.

  • anypro12
    anypro12

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

     #include<set>
     #include<cstdio>
     #include<cassert>
     #include<algorithm>
     #include<cstdlib>
     #include<iostream>
     #include<string>
     #include<vector>
     using namespace std;
    
    int brute(const vector<int>& russian, vector<int> 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<int>& russian, vector<int> korean) {
        int n = russian.size();
        vector<bool> taken(n, false);
        sort(korean.begin(), korean.end(), greater<int>());
        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<int>& russian, const vector<int>& korean) {
        int n = russian.size(), wins = 0;
        // 아직 남아 있는 선수들의 레이팅
        multiset<int> 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);
        }
    }
    


    11년 전
1개의 댓글이 있습니다.
  • JongMan
    JongMan

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


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