予鈴

アウトプットとメモ書きの中間みたいな記事がたくさん出ます。

B - Sports Festival

問題

atcoder.jp
かなり考察したのに解けなかった。悔しいのでここで供養します。

考察

 A_{ij}を使いたいとすると、用いることができるスポーツはj < kを満たすような A_{ik}
ただし、その他の行で何が一番になるか比較するのは計算量的に怪しい(と思う)
・ある A_{ij}に着目してから実験するのはかなり難しい。

正解

最も参加人数の多いスポーツがスポーツ P で、その参加人数が Q 人だとします。当
り前ですが、この段階で、参加人数の最大値が Q の解が得られています。よって、あと考えるべき
は、参加人数の最大値が Q 未満の解です。そして、そのような解において、スポーツ P は必ず実
施されません。なので、Q 未満の解を求めるには、スポーツ P を候補から外した上で、もう一度
同じ問題を解きなおせばよいです

悔しすぎる。単純に、参加者が多いスポーツを候補から外せばいいという事がわかる。
できないと感じながら実装したのが間違いだった & そうなったときに新しい切り口を見つけるのが今後の課題かも。

解答

#include<bits/stdc++.h>
using namespace std;
set<int>S;
int ans = 1e8;
void simulate(vector<vector<int>>&g){
    map<int,int>cnt;
    for(int i = 0; i < g.size(); ++i){
        for(int j = 0; j < g[i].size(); ++j){
            auto crt = g[i][j];
            if(S.find(crt) == S.end()){continue;}
            cnt[crt]++;
            break;
        }
    }
    int maxim = -1, num = -1;
    for(auto itr : cnt)
        if(maxim < itr.second)
            maxim = itr.second, num = itr.first;
    ans = min(ans,maxim);
    S.erase(num);
    if(not S.empty()) simulate(g);
}
int main(){
    int N,M; cin >> N >> M;
    vector<vector<int>>g(N,vector<int>(M));
    for(auto& v : g)
        for(auto&  e: v) cin >> e;
    for(int i = 1; i <= M; ++i){
        S.insert(i);
    }
    simulate(g);
    cout << ans << endl;
}