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

【C++】最初の生徒(Kamal)より合計スコアが高い生徒の人数を数えるプログラム

n人の生徒が5教科のテストを受けたとします。最初のスコアはKamalのもので、残りのn-1件は他の生徒のスコアです。各生徒は5教科それぞれの点数を持っており、その中からKamalよりも高い合計スコアを獲得した生徒の人数を数えることを考えます。

ここでは、各生徒のスコアを管理するための Student クラスを定義します。このクラスには、点数を受け取る input() 関数と、5教科の点数から合計点を計算する calculateTotalScore() 関数を実装します。

たとえば、入力が n = 4、scores = [[25,45,32,42,30],[22,25,41,18,21],[37,42,48,45,25],[36,48,35,40,30]] の場合、出力は 2 になります。これは、最後の2人の生徒の合計スコアがKamalを上回っているためです。

解法のアプローチ

以下の手順で問題を解くことができます。

  • s := Student型のオブジェクトをn個格納する配列を作成する
  • i = 0 から n-1 までループし、scores[i] のすべての点数を s[i] に読み込む
  • kamal_sc := s[0](Kamal)の合計点を求める
  • count := 0 で初期化する
  • i = 1 から n-1 までループし、各生徒について以下を処理する
    • total := s[i] の合計点を計算する
    • total > kamal_sc であれば、count を1増やす
  • 最後に count を返す

実装例

理解を深めるために、以下の実装例を確認してみましょう。

#include <iostream>
#include <vector>
using namespace std;
class Student{
    public:
     int score[5];
     void input(vector<int> v){
         for(int i = 0; i < 5; i++)
             score[i] = v[i];
     }
     int calculateTotalScore(){
         int res = 0;
         for(int i = 0; i < 5; i++)
             res += score[i];
         return res;
     }
};
int main(){
    int n = 4;
    vector<vector<int>> scores = {{25,45,32,42,30},{22,25,41,18,21},{37,42,48,45,25},{36,48,35,40,30}};
    Student *s = new Student[n];
    for(int i = 0; i < n; i++){
        s[i].input(scores[i]);
    }
    int kamal_sc = s[0].calculateTotalScore();
    int count = 0;
    for(int i = 1; i < n; i++){
        int total = s[i].calculateTotalScore();
        if(total > kamal_sc){
            count++;
        }
    }
    cout << count;
}

入力

4, {{25,45,32,42,30}, {22,25,41,18,21}, {37,42,48,45,25}, {36,48,35,40,30}}

出力

2

出力の解説

各生徒の合計スコアを計算すると次のようになります。

  • Kamal(1人目):25 + 45 + 32 + 42 + 30 = 174
  • 2人目:22 + 25 + 41 + 18 + 21 = 127
  • 3人目:37 + 42 + 48 + 45 + 25 = 197
  • 4人目:36 + 48 + 35 + 40 + 30 = 189

Kamalの合計174を上回っているのは3人目(197)と4人目(189)の2人であるため、出力は「2」となります。このアルゴリズムの計算量はO(n)であり、生徒の人数に比例して処理が行われるため、非常に効率的です。

  1. C++で3つの点が同一直線上にあるかどうかを判定するプログラム

    3つの異なる座標を持つ点が与えられ、それらの点が同一直線上に並んでいるかどうか(共線性・コリニア)を判定するのが本記事のテーマです。3つの点がすべて同じ直線上に乗っている場合、これらの点は「共線(collinear)」であるといいます。逆に、異なる直線上に配置されている場合は共線ではありません。以下の図は、共線な点と共線でない点の違いを示したものです。入力例と出力例入力1x1 = 1, x2 = 2, x3 = 3, y1 = 1, y2 = 4, y3 = 5出力1no points are not collinear入力2x1 = 1, y1 = 1, x2 = 1, y2 = 4, x3

  2. C++でべき等行列を判定するプログラムの作成方法

    行数を r、列数を c とする行列 M[r][c] が与えられ、r = c となる正方行列を考えます。この記事では、与えられた正方行列がべき等行列(アイデンポテント行列)であるかどうかを判定するC++プログラムを解説します。 べき等行列とは 行列 M がべき等行列であるとは、行列 M と自分自身の積が元の行列 M と等しくなること、すなわち M × M = M が成り立つことを指します。 例えば、次の行列を見てください。 この行列を自分自身で掛け合わせても、結果は元の行列とまったく同じになります。したがって、この行列はべき等行列であると言えます。 べき等行列の代表的な例としては、ベクトルを