C++
 Computer >> コンピューター >  >> プログラミング >> C++

コーディングコンテスト後の学生の順位を求めるC++プログラム


問題概要

n個の要素からなる配列Aがあるとします。あるコーディングコンテストには合計n人の学生が参加し、開始前の時点で全員が正の整数のレーティングを持っています。A[i]はi番目の学生のレーティングを表します。コンテスト終了後、すべての学生はそれぞれ正の整数の順位に着くことになります。学生はレーティングに応じて順位が決まり、学生Aのレーティングが学生Bより厳密に低い場合、Aの順位はBより厳密に大きい(下位の)番号になるとします。ここで、コンテスト終了時の各学生の順位を求めます。

例として、入力がA = [3, 5, 3, 4, 5]である場合を考えてみましょう。このとき出力は[4, 1, 4, 3, 1]になります。2番目と5番目の学生が最も高いレーティングで1位を分け合い、4番目の学生がその次の3位、そして1番目と3番目の学生が最も低い4位を分け合うためです。

解法の考え方

この問題は、次の手順で解くことができます。

  • 配列Aのサイズをnとします。
  • 各学生iについて、「自分のレーティングA[i]よりも厳密に高いレーティングを持つ学生の人数」を数えます。
  • その人数に1を加えた値が、i番目の学生の最終的な順位になります。同点の学生は自動的に同じ順位を共有することになります。

この方法の計算量はO(n²)ですが、実装が非常にシンプルで、同点による順位の共有も自然に処理できるのが特徴です。

アルゴリズム(擬似コード)

n := Aのサイズ
i := 0 から開始し、i < n の間繰り返す(iを1ずつ増やす):
    d := 1
    j := 0 から開始し、j < n の間繰り返す(jを1ずつ増やす):
        もし A[j] > A[i] ならば:
            d を 1 増やす
    cout << d << ", "

C++での実装例

理解を深めるために、実際のC++による実装を見てみましょう。

#include <bits/stdc++.h>
using namespace std;
void solve(vector<int> A){
    int n = A.size();
    for (int i = 0; i < n; i++){
        int d = 1;
        for (int j = 0; j < n; j++){
            if (A[j] > A[i])
                d++;
        }
        cout << d << ", ";
    }
}
int main(){
    vector<int> A = { 3, 5, 3, 4, 5 };
    solve(A);
}

入力

{ 3, 5, 3, 4, 5 }

出力

4, 1, 4, 3, 1,

出力結果を見ると、2番目と5番目の学生が「1」、4番目の学生が「3」、1番目と3番目の学生が「4」となっており、期待どおりの順位が正しく求められていることが確認できます。

  1. C++で解説:T秒後のカエルの位置を求める確率計算アルゴリズム

    n個の頂点からなる無向木(ツリー)があるとします。頂点には1からnまでの番号が付けられており、カエルは頂点1からジャンプを開始します。カエルは、現在いる頂点に隣接している「未訪問」の頂点へ、1秒でジャンプすることができますが、一度訪れた頂点へ戻ることはできません。ジャンプ先の候補が複数ある場合は、いずれも等しい確率でランダムに1つを選んで移動します。逆に、行ける未訪問の頂点がなくなったカエルは、その場で永遠に跳ね続けることになります。 木は辺の配列として与えられます。ここで求めたいのは、「t秒後にカエルが頂点targetの上にいる確率」です。 問題の例 たとえば、入力が n = 7、t = 2

  2. C++で一連の移動後のロボットの最終位置を求める

    問題概要 この問題では、上下左右の4方向に移動できるロボットが与えられます。方向は上(U)、下(D)、左(L)、右(R)の4種類です。また、これらの方向の頭文字からなる移動指示の文字列が与えられます。ロボットの初期位置を (0, 0) としたとき、一連の移動をすべて実行した後の最終位置を出力することが課題です。 例で問題を理解しよう 入力 − LDRRUL 出力 − (0, 0) 説明 − 各移動ごとの座標の変化は以下の通りです。 L(左) : (0,0) → (-1,0) D(下) : (-1,0) → (-1,-1) R(右) : (-1,-1) → (0,-1) R(右) : (0,