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

C++のゲームでゼロ以下に減らすことができる数を数えます


正の数の配列と2つの整数AおよびBが与えられます。2人のプレーヤーが、配列内の数を減らすゲームをプレイしています。プレーヤー1は配列の任意の要素をAだけ減らすことができ、プレーヤー2は配列の任意の要素をBだけ増やすことができます。目標は、プレーヤー1が0以下に減らすことができる数の数を見つけることです。最初の動き。一度0以下に減少した数は、プレーヤー2では考慮できません。

入力

arr[] = { 1,4,5,2 } A=2, B=3

出力

Count of numbers that can be reduced to zero or less in a game are: 1

説明

The only number that can be reduced by player 1 is 1 as on first move it
will be reduced to −1. Rest all will become greater than A after player 2 increases their value.

入力

arr[] = { 1,4,5,2 } A=4, B=4

出力

Count of numbers that can be reduced to zero or less in a game are: 2

説明

On first move player 1 reduces 4 to 0. arr[]= [ 1, 0, 5, 2 ]
Player 2 will increase 1 to 4. arr[]= [ 5, 0, 5, 2 ]
Player 1 will decrease 2 to −2. Arr[] = [ 5, 0, 5, −2 ].
From now onwards all numbers are greater than A so cannot be reduced by player 1 to 0 or less as player 2 is also increasing them simultaneously.

以下のプログラムで使用されるアプローチは次のとおりです

このアプローチでは、最初にA>Bかどうかを確認します。はいの場合、N回移動すると、Aはarr[]のN個の要素すべてを0以下に減らします。A<=Bの場合、チェックします

  • プレーヤー2がBを追加した後でも、Aより大きくならないすべての数値。これをC1としてカウントするとしましょう。

  • プレーヤー2がBを追加した後、A未満で、Aより大きくなるすべての数値。これをC2としてカウントするとしましょう。

合計数はC=C1 +(C2 + 1)/2になります。ケース2のように、両方のプレーヤーが同時にそれらを増減するので、それらの半分だけが0以下に減少します。そして、プレーヤー2はそれらの半分をAより大きくすることしかできません。その間、プレーヤー1は残りの半分を<=0に減らします。

  • 正の数を含む整数配列を取ります。

  • 2つの変数AとBを取ります。

  • 関数reduced_zero(int arr []、int size、int A、int B)は、ゲームでゼロ以下に減らすことができる数のカウントを返します

  • 初期カウントを0とします。

  • 2つの変数temp_1とtemp_2を一時的なカウントとして使用します。

  • A> Bの場合、サイズである配列の長さを返します。

  • 次に、forループを使用して配列をトラバースします。各arr [i]について、要素とBの合計が

  • 要素ごとにarr[i]<=A、temp_2をインクリメントします。

  • ここで、forループの終了後、count =temp_1 +(temp_2 + 1)/2を取ります。式で与えられるように。

  • 結果としてカウントを返します。

#include <bits/stdc++.h>
using namespace std;
int reduced_zero(int arr[], int size, int A, int B){
   int count = 0;
   int temp_1 = 0, temp_2 = 0;
   if (A > B){
      return size;
   }
   for(int i = 0; i < size; i++){
      if (A >= arr[i] + B){
         temp_1++;
      }
      else if(A >= arr[i]){
         temp_2++;
      }
   }
   int temp = (temp_2 + 1) / 2;
   count = temp + temp_1;
   return count;
}
int main(){
   int arr[] = { 3, 3, 1, 2, 4, 7, 1};
   int A = 4, B = 1;
   int size = sizeof(arr) / sizeof(arr[0]);
   cout<<"Count of numbers that can be reduced to zero or less in a game are:  "<<reduced_zero(arr, size, A, B);
   return 0;
}

出力

上記のコードを実行すると、次の出力が生成されます-

Count of numbers that can be reduced to zero or less in a game are: 7

  1. C ++で数値のxorがゼロより大きくなるように、すべての行の数値を選択できるかどうかを確認します。

    サイズNxMの2D配列が1つあるとします。タスクは、これらの要素のXORがゼロ以外または0より大きいように、すべての行から数値を選択できるかどうかを確認することです。1つの行列がこのように- 7 7 7 10 10 7 XORを実行すると、2つの行の最後の要素が7と10である場合を除いて、答えはゼロ以外になります。 この問題を解決するための解決策は非常に簡単です。最初に、各行の最初の列の要素のXORが0であるかどうかを確認します。ゼロ以外の場合は可能です。それ以外の場合は、いずれかの行に2つ以上の異なる要素があるかどうかを確認します。ある場合は、それ

  2. C++でオーバーロードできない関数

    C ++では、関数をオーバーロードできます。ただし、オーバーロードが行われない場合もあります。このセクションでは、関数をオーバーロードできないさまざまなケースについて説明します。 関数のシグネチャが同じである場合、戻り値のタイプのみが異なるため、関数をオーバーロードすることはできません。 int my_func() {    return 5; } char my_func() {    return 'd'; } メンバー関数がクラス内で同じ名前と同じパラメーターリストを持っている場合、それらをオーバーロードすることはで