公式

B - 入団オーディション / Audition for Admission 解説 by physics0523


ソートに頼らない解法を説明します。

まず、候補者の得点を受け取ります。その後、辞退者の得点を \(-1\) 点であるとします。(この処理は配列を活用すると実現可能です。)
そして、人 \(2\) 以降で人 \(1\) より得点の高い人数に \(1\) を加えたものを \(rk\) とします。
このとき、 \(rk\) は高橋君の合格の優先順位となり、 \(rk \le K\) であるとき、またその時に限り高橋君は合格します。

本解法の時間計算量は \(O(N)\) です。

実装例 (C++):

#include<bits/stdc++.h>

using namespace std;

int main(){
  int N,K,M;
  cin >> N >> K >> M;
  vector<int> S(N+1);
  for(int i=1;i<=N;i++){cin >> S[i];}
  for(int i=0;i<M;i++){
    int D;
    cin >> D;
    S[D]=-1;
  }
  int rk=1;
  for(int i=2;i<=N;i++){
    if(S[1]<S[i]){rk++;}
  }
  if(rk<=K){cout << "Yes\n";}
  else{cout << "No\n";}
  return 0;
}

投稿日時:
最終更新: