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

【C++】全員にボーナス点を加算しても100点を超えない条件下で、合格できる学生の最大人数を求めるプログラム

この問題では、クラス内の各学生の試験点数を格納したサイズ n の配列 stu[] が与えられます。各学生の満点は100点であり、合格には50点以上が必要です。全員に一律でボーナス点を加算し、かつ誰の点数も100点を超えないという条件のもとで、合格できる学生の最大人数を求めるプログラムを作成することが課題です。

問題の概要

合格者を増やすために学生へボーナス点を与えますが、このボーナスはクラス全体に対して同じ値を加算しなければなりません。誰かの合計点が100点を超えてしまわない範囲でボーナス点を設定し、それによって合格できる学生の数を最大化します。最後に、合格できる学生の最大人数を返します。

入出力例で問題を理解する

入力

stu[] = {45, 32, 78, 10, 53, 67}

出力

5

説明

合格できる学生は以下の通りです。
45 + 22 = 67
32 + 22 = 54
78 + 22 = 100
53 + 22 = 75
67 + 22 = 89

最高得点は78点なので、加算できるボーナスは 100 − 78 = 22点です。このボーナスを全員に加算すると、上記の5人が50点以上となり合格できます(10点の学生は 10 + 22 = 32 点のため不合格)。

解決アプローチ

この問題を解くには全員にボーナス点を加算しますが、どの学生の点数も100点を超えてはならない点に注意が必要です。したがって、与えられることのできる最大のボーナス点は次のように計算できます。

最高得点者の点数(M) + ボーナス = 100
ボーナス = 100 − M

このボーナス点を全員の現在の点数に加算し、合計が50点以上であればその学生は合格です。答えは、条件を満たした学生の総数となります。

アルゴリズム

初期化

passCount = 0;

ステップ1

最高得点(maxMarks)を持つ学生を見つける。

ステップ2

全員に与えられるボーナス点を計算する。bonus = 100 − maxMarks。

ステップ3

i を 0 から n−1 までループさせる。

ステップ3.1

if(stu[i] + bonus >= 50) の場合、passCount++ とする。

ステップ4

passCount を返す。

C++実装例

ソリューションの動作を示すプログラムは以下の通りです。

#include<iostream>
using namespace std;
int calcPassCount(int stu[], int n) {
    int maxMarks = stu[0];
    for(int i = 1; i < n; i++){
        if(stu[i] > maxMarks)
            maxMarks = stu[i];
    }
    int bonusMarks = 100 − maxMarks;
    int passCount = 0;
    for(int i = 0; i < n; i++) {
        if(stu[i] + bonusMarks >= 50)
            passCount ++;
    }
    return passCount;
}
int main() {
    int stu[] = {45, 32, 78, 10, 53, 67};
    int n = sizeof(stu)/sizeof(stu[0]);
    cout<<"全員にボーナスを与えた後に合格できる学生の最大人数は "<<calcPassCount(stu, n);
    return 0;
}

出力

全員にボーナスを与えた後に合格できる学生の最大人数は 5

計算量について

このアルゴリズムでは配列を2回走査するため、時間計算量は O(n) です。また、使用する変数は定数個のみであるため、空間計算量は O(1) となります。非常にシンプルかつ効率的な解法と言えるでしょう。

  1. C++で株式の売買から得られる最大利益を計算する方法

    この問題では、i日目の株価を表す配列 stkprice[] が与えられ、C++で株式の売買によって得られる最大利益を計算するプログラムを作成します。 問題の概要 ここで求められているのは、いつ株を買い、いつ売れば利益を最大化できるかを見極めることです。利益を生むためには、株価が安いときに購入し、価格が上昇したタイミングで売却します。その後、再び価格が下落した局面が現れたら、同じ売買サイクルを繰り返します。 具体例を使って問題を理解しましょう。 入力 stkprice[] = {120, 310, 405, 210, 150, 550} 出力 685 説明 1日目に購入して3日目に売却すると、2

  2. C++で解く「ビフォーアフターパズル」:共通する単語でフレーズを結合するアルゴリズム

    問題の概要小文字の英字と半角スペースのみで構成されるフレーズのリストが与えられ、そこから「ビフォーアフターパズル(Before and After Puzzles)」と呼ばれる新しいフレーズを生成することを考えます。各フレーズには先頭・末尾にスペースがなく、連続するスペースも含まれていないものとします。ビフォーアフターパズルとは、2つのフレーズを結合してできるフレーズのことです。条件は「1つ目のフレーズの最後の単語」と「2つ目のフレーズの最初の単語」が一致することで、この共通単語を介して2つのフレーズをつなぎ合わせます。求めるのは、リスト内のすべての異なるペア phrases[i] と phr