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

C++でバッテリーの組み合わせ数を求めるアルゴリズム

最大5回まで使用できるバッテリーがn本あるとします。ここで、3本のバッテリーを必要とするデバイスがあり、デバイスを使用するたびにバッテリーの使用回数が1ずつ増加します。デバイスをk回使用したい場合、それらを動かすために何通りのバッテリーの組み合わせを作れるかを求める必要があります。ただし、1本のバッテリーを複数のデバイスで同時に使用することはできず、すでに5回使用されたバッテリーは組み合わせに含められません。各バッテリーの現在の使用回数は配列battとして与えられます。

例えば、入力が n = 6、k = 2、batt = {2, 4, 4, 2, 1, 3} の場合、出力は 1 になります。これは、k回分のデバイス稼働に対応できるバッテリーの組み合わせが1通りしか作れないことを意味します。

解法の考え方

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

  • 答えを格納する変数 ans を0で初期化します。
  • すべてのバッテリーについて、「現在の使用回数 + k」が5以下になるかどうか、つまりあとk回使用しても上限に達しないかを確認します。
  • 条件を満たすバッテリーの本数をカウントします。
  • 最後に、カウントした本数を3で割った値(整数除算)を返します。1台のデバイスに3本のバッテリーが必要だからです。
ans := 0
for initialize i := 0, when i < n, update (increase i by 1), do:
    if batt[i] + k <= 5, then:
        (increase ans by 1)
return ans / 3

C++による実装例

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

#include <bits/stdc++.h>
using namespace std;
#define N 100
int solve(int n, int k, int batt[]) {
    int ans = 0;
    for(int i = 0; i < n; i++){
        if(batt[i] + k <= 5)
            ans++;
    }
    return ans / 3;
}
int main() {
    int n = 6, k = 2, batt[] = {2, 4, 4, 2, 1, 3};
    cout<< solve(n, k, batt);
    return 0;
}

入力

6, 2, {2, 4, 4, 2, 1, 3}

出力

1

動作の解説

この例では、各バッテリーの使用回数にk=2を加えると {4, 6, 6, 4, 3, 5} となります。このうち「5以下」という条件を満たすのは 4, 4, 3, 5 の4本です。4本を3で割ると1になるため、作成できる組み合わせは1通りという結果になります。

  1. グリッド内で照らされているセルの数を求めるC++プログラム

    問題の概要 ここでは、縦 h × 横 w のサイズを持つグリッドが与えられたとき、光で照らされているセルの数を求めるC++プログラムを紹介します。グリッドのセルには「電球」または「障害物」が置かれています。電球のあるセルは、そのセル自身と上下左右のセルを照らし、光は障害物に遮られない限りまっすぐ伝わっていきます。一方、障害物のあるセルは照らされることがなく、電球の光を遮って他のセルへ光が届かないようにします。電球の位置を配列 bulb、障害物の位置を配列 obstacles として受け取り、グリッド全体で照らされているセルの合計数を求めます。 たとえば、入力が h = 4、w = 4、bulb

  2. C++でn番目のスターナンバー(星形数)を求めるプログラム

    この記事では、整数 n が与えられたときに、n番目のスターナンバー を求めるC++プログラムの作成方法を解説します。スターナンバーとは?スターナンバー(Star Number)とは、中心に点を置き、その周囲に六芒星(六角星)の形を描いたときの点の総数を表す特殊な数です。図形的には「中心付き六芒星数」と呼ばれることもあります。スターナンバーの例は以下の通りです。1, 13, 37, 73, 121, ...問題の理解具体的な入力と出力の例を見てみましょう。入力n = 5出力121n = 5 のとき、5番目のスターナンバーである 121 が出力されます。解法のアプローチn番目のスターナンバーは、次