公式

B - 奨学金選考 / Scholarship Selection 解説 by kyopro_friends


問題文の指示通り、順に実装していきましょう。

実装例 (C++)

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

int main(){
  int n, m, k;
  cin >> n >> m >> k;
  vector<int>t(m);
  for(int i=0; i<m; i++) cin >> t[i];
  vector<vector<int>>s(n, vector<int>(m));
  for(int i=0; i<n; i++){
    for(int j=0; j<m; j++) cin >> s[i][j];
  }

  vector<int>x;
  for(int i=0; i<n; i++){
    bool ok = true;
    for(int j=0; j<m; j++){
      if(s[i][j] < t[j]){
        ok = false;
      }
    }
    if(ok){
      x.push_back(i);
    }
  }

  if(x.size() <= k){
    for(auto i: x){
      cout << i+1 << endl;
    }
    return 0;
  }

  map<int,int>p;
  vector<int>points;
  for(auto i: x){
    int pi = 0;
    for(int j=0; j<m; j++){
      pi += s[i][j];
    }
    p[i] = pi;
    points.push_back(pi);
  }

  sort(points.rbegin(), points.rend());
  int b = points[k-1];

  for(auto[i, v]: p){
    if(v >= b){
      cout << i+1 << endl;
    }
  }
}

実装例 (Python)

N, M, K = map(int, input().split())
T = list(map(int, input().split()))
S = []
for _ in range(N):
  si = list(map(int, input().split()))
  S.append(si)

X = []
for i, si in enumerate(S):
  if all (sij >= tj for sij, tj in zip(si, T)):
    X.append(i)

if len(X) <= K:
  for i in X:
    print(i+1)
  exit()

P = {}
for i in X:
  pi = sum(sij for sij in S[i])
  P[i] = pi

B = sorted(P.values())[-K]

for i, v in sorted(P.items()):
  if v >= B:
    print(i+1)

投稿日時:
最終更新: