配列の要素をdで割った後、正の数が配列サイズの半分以上になるようなdを求めるC++プログラム
n個の要素からなる配列Aがあるとします。配列内のすべての数値を、ある非ゼロ整数dで割ったとき、結果として配列に現れる正の値の個数が配列サイズの半分以上になるようなdを見つけるのがこの問題です。条件を満たすdが複数存在する場合は、そのうちのどれか1つを返せば構いません。
例として、入力が A = [10, 0, -7, 2, 6] の場合を考えてみます。n = 5 なので、除算後には少なくとも ⌈5/2⌉ = 3 個の要素が正である必要があります。d = 4 を選んだ場合、除算後の配列は [2.5, 0, -1.75, 0.5, 1.5] となり、正の数は 2.5、0.5、1.5 の3個あるため、条件を満たしています。
解法のポイント
この問題は、数の符号に関する性質を利用すると非常にシンプルに解くことができます。正の数dで割り算をしても各要素の符号は変化しません。一方、負の数dで割ると、すべての要素の符号が反転します。つまり、元の配列に含まれる正の要素と負の要素の個数を数えるだけで答えが求まります。
- 正の要素の個数が配列サイズの半分以上の場合:d = 1 を返します。
- 負の要素の個数が配列サイズの半分以上の場合:d = -1 を返します(符号が反転するため、正の数が半分以上になります)。
- いずれの条件も満たさない場合:どのような非ゼロ整数dを選んでも条件を満たせないため、0 を返します。
アルゴリズムの手順
以下の手順に従って問題を解きます。
z := 0, f := 0
n := size of A
for initialize i := 0, when i < n, update (increase i by 1), do:
a := A[i]
if a > 0, then:
(increase z by 1)
if a < 0, then:
(increase f by 1)
if 2 * z >= n, then:
return 1
otherwise when 2 * f >= n, then:
return -1
Otherwise
return 0C++での実装例
理解を深めるために、実際の実装を見てみましょう。
#include <bits/stdc++.h>
using namespace std;
int solve(vector<int> A){
int z = 0, f = 0;
int n = A.size();
for (int i = 0; i < n; i++){
int a = A[i];
if (a > 0)
z++;
if (a < 0)
f++;
}
if (2 * z >= n)
return 1;
else if (2 * f >= n)
return -1;
else
return 0;
}
int main(){
vector<int> A = { 10, 0, -7, 2, 6 };
cout << solve(A) << endl;
}入力
{ 10, 0, -7, 2, 6 }出力
1
この入力では、正の要素は 10、2、6 の3個であり、2 × 3 = 6 が配列サイズの5以上となるため、関数は 1 を返します。
-
C++で配列要素の加減算により指定範囲内の最大値を求める方法
問題文整数の配列、初期値となる数値、および最大値が与えられます。配列の要素を先頭から順に走査し、各要素について「現在の結果に加算する」か「減算する」かを選択します。ただし、どの時点でも結果は 0 以上かつ最大値以下でなければなりません。インデックス 0 の処理では、与えられた数値を初期結果として扱います。条件を満たす答えが存在しない場合は -1 を出力します。例として、arr[] = {3, 10, 6, 4, 5}、number = 1、最大値 = 15 が与えられた場合、次の順序で加算・減算を行うと出力は 9 になります。1 + 3 + 10 - 6 - 4 + 5アルゴリズムこの問題は再
-
C++で配列の全要素がK以上になるまで最小要素を加算する方法
配列(Array)とは、同じデータ型の要素を格納するコンテナであり、各要素は0から始まるインデックスで管理されます。この記事では、整数型の配列を扱い、配列内のすべての要素が指定された数値以上であるかどうかを確認します。具体的には、配列のすべての要素が与えられた数値 K 以上になっているかを判定し、条件を満たしていない場合は、配列内で最も小さい2つの要素を取り出して合計し、その合計値を1つの新しい要素として扱います。その後、再び同じ条件で新しい配列をチェックします。条件が満たされれば、加算を実行した回数を結果として返します。問題例Array = { 2, 6, 3, 12, 7 } K = 5