企業推薦の最適化アルゴリズム

プログラミングコンテスト終了後、企業の採用担当は成績優秀者を推薦する必要がある。推薦条件は以下の通り:

  • コンテスト得点が175点以上であること
  • 最大K回の推薦ラウンドが可能
  • 各ラウンドでは得点が厳密に増加する順序で推薦
  • PAT試験の合格者(スコアが基準以上)は同点でも推薦可

入力形式

最初の行には3つの整数N(≤10⁵)、K(≤5×10³)、S(≤100)が与えられる。続くN行には、各学生のコンテストスコアとPATスコアが記載される。

出力形式

推薦可能な学生の最大数を出力する。

入力例

10 2 90
203 0
169 91
175 88
175 0
175 90
189 0
189 0
189 95
189 89
256 100

出力例

8

最初のラウンドでは、得点175, 189, 203, 256の各グループから代表者を選出。さらにPAT合格者の175点と189点の学生も追加。二回目のラウンドでは残りの175点と189点の学生を推薦。

#include<bits/stdc++.h>
using namespace std;

const int MAX_SCORE = 400;
int contest_count[MAX_SCORE], pat_pass[MAX_SCORE];
int total_students, max_rounds, pass_line;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    
    cin >> total_students >> max_rounds >> pass_line;
    
    for (int i = 0; i < total_students; i++) {
        int contest_score, pat_score;
        cin >> contest_score >> pat_score;
        
        contest_count[contest_score]++;
        if (pat_score >= pass_line) {
            pat_pass[contest_score]++;
        }
    }
    
    int recommended_count = 0;
    
    for (int score = 175; score < MAX_SCORE; score++) {
        // PAT合格者は無条件で推薦
        recommended_count += pat_pass[score];
        
        // PAT未合格者の処理
        int remaining_candidates = contest_count[score] - pat_pass[score];
        recommended_count += min(remaining_candidates, max_rounds);
    }
    
    cout << recommended_count << "\n";
    return 0;
}

タグ: Algorithm competitive-programming greedy-algorithm

7月31日 17:31 投稿