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

猫の言葉が正しいかどうかを色付きの帽子でチェックするC++プログラム


N個の要素を持つ配列Aがあるとします。 N匹の猫がいて、1からNまでの番号が付けられているとします。各猫は帽子をかぶっていて、i番目の猫は「私以外の猫が所有するN-1個の帽子には正確にA[i]個の異なる色があります」と言います。猫の発言と一致する帽子の色のシーケンスが存在するかどうかを確認する必要があります。

したがって、入力がA =[1、2、2]の場合、出力はTrueになります。これは、猫1、2、3がそれぞれ赤、青、青の帽子をかぶっている場合、次のようになります。猫の発言。

これを解決するには、次の手順に従います-

 mn:=inf、mx =0、cnt =0n:=Aのサイズ初期化i:=1のサイズ(n + 1)の配列aを定義し、i <=nの場合、更新(iを1増やします) 、do:a [i]:=A [i --1] mn:=最小mnおよびa [i] mx=最大mxおよびa[i]初期化i:=1の場合、i <=nの場合、更新(iを1増やします)、次のようにします。a [i]がmnと同じ場合、:( cntを1増やします)mxがmnと同じ場合、次のようにします。mnがn-1または2 *mn<=と同じ場合n、then:return trueそれ以外の場合はfalseを返します(mxがmn + 1と同じ場合)then:if mn> =cnt and n --cnt> =2 *(mx --cnt)、then:returntrueそれ以外の場合はfalseを返します 

理解を深めるために、次の実装を見てみましょう-

 #include usingnamespace std; boolsolve(vector  A){int mn =99999、mx =0、cnt =0; int n =A.size(); vector  a(n + 1); for(int i =1; i <=n; ++ i){a [i] =A [i-1]; mn =min(mn、a [i])、mx =max(mx、a [i]); } for(int i =1; i <=n; ++ i)if(a [i] ==mn)++ cnt; if(mx ==mn){if(mn ==n --1 || 2 * mn <=n)はtrueを返します。それ以外の場合はfalseを返します。 } else if(mx ==mn + 1){if(mn> =cnt &&n --cnt> =2 *(mx --cnt))return true;それ以外の場合はfalseを返します。 } else return false;} int main(){vector  A ={1、2、2}; cout < 

入力

 {1、2、2} 

出力

 1 

  1. アレイが回文であるかどうか、またはC++でSTLを使用していないかどうかを確認するプログラム

    n個の整数の配列arr[n]が与えられた場合、タスクは配列が回文であるかどうかを見つけることです。 C++でSTLを使用して指定されたタスクを実行する必要があります。 C ++には、STL(標準テンプレートライブラリ)の機能があります。これは、データ構造と、スタック、キュー、リストなどのいくつかの機能を提供するために使用されるC ++テンプレートクラスのセットです。これらを使用するには、知識が必要です。テンプレートクラスの。 回文は、シーケンスの前または後ろから同じように読み取られるシーケンスです。回文の簡単な例としては、-MADAM、RACECARなどがあります。配列は、以下の例のような

  2. C++で3つのポイントが同一線上にあるかどうかをチェックするプログラム

    3つの異なる値のポイントが与えられ、タスクはポイントが同一線上にあるかどうかを確認することです。 ポイントが同じ線上にある場合は同一線上にあると言われ、異なる線上にある場合は同一線上にありません。以下に、同一線上および非同一線上の点の図を示します。 入力 x1 = 1, x2 = 2, x3 = 3, y1 = 1, y2 = 4, y3 = 5 出力 no points are not collinear 入力 x1 = 1, y1 = 1, x2 = 1, y2 = 4, x3 = 1, y3 = 5 出力 points are collinear 以下のプログラム