C++プログラムの各放射ステーションの最終放射
直線上にN個の駅があるとします。それらのそれぞれは、放射電力の同じ非負の電力を持っています。すべてのステーションは、次の方法で隣接するステーションの放射電力を増やすことができます。
放射電力Rのステーションiが、(i – 1)番目のステーションの放射電力をR-1だけ増加させ、(i-2)番目のステーションの放射電力をR-2だけ増加させ、(i + 1)番目のステーションの放射電力を増加させるとします。 R-1による放射電力、(i + 2)R-2によるステーションの放射電力。後で。したがって、たとえば、配列がArr =[1、2、3]の場合、出力は3、4、4になります。新しい放射は[1 +(2 – 1)+(3 -2)、 2 +(1 – 1)+(3 – 1)、3 +(2 – 1)] =[3、4、4]
アイデアは単純です。各ステーションについて、有効放射が負になるまで、上記のように隣接ステーションの放射を増やします。
例
#include <iostream> using namespace std; class pump { public: int petrol; int distance; }; int findStartIndex(pump pumpQueue[], int n) { int start_point = 0; int end_point = 1; int curr_petrol = pumpQueue[start_point].petrol - pumpQueue[start_point].distance; while (end_point != start_point || curr_petrol < 0) { while (curr_petrol < 0 && start_point != end_point) { curr_petrol -= pumpQueue[start_point].petrol - pumpQueue[start_point].distance; start_point = (start_point + 1) % n; if (start_point == 0) return -1; } curr_petrol += pumpQueue[end_point].petrol - pumpQueue[end_point].distance; end_point = (end_point + 1) % n; } return start_point; } int main() { pump PumpArray[] = {{4, 6}, {6, 5}, {7, 3}, {4, 5}}; int n = sizeof(PumpArray)/sizeof(PumpArray[0]); int start = findStartIndex(PumpArray, n); if(start == -1) cout<<"No solution"; else cout<<"Index of first petrol pump : "<<start; }
出力
Index of first petrol pump : 1
-
C++で各デカルト座標を接続するための最小コストを見つけるプログラム
2Dデカルト座標点(x、y)のリストがあるとします。 (x0、y0)と(x1、y1)を接続できます。コストは| x0--x1|です。 + | y0--y1|。任意の数のポイントを接続できる場合は、すべてのポイントがパスで接続されるように、必要な最小コストを見つける必要があります。 したがって、入力がpoints =[[0、0]、[0、2]、[0、-2]、[2、0]、[-2、0]、[2、3]、[2 、-3]]、 (0、0)から(0、2)、(0、-2)、(2、0)、(-2、0)、コストは2、合計は8であるため、出力は14になります。 (2、3)は(0、2)に最も近く、コストは| 2 +1
-
C ++プログラムでの二分探索?
二分探索は、半区間探索、対数探索、または二分探索とも呼ばれ、ソートされた配列内のターゲット値の位置を見つける検索アルゴリズムです。二分探索は、ターゲット値を配列の中央の要素と比較します。それらが等しくない場合、ターゲットが存在できない半分が削除され、残りの半分で検索が続行され、再び中央の要素がターゲット値と比較され、ターゲット値が見つかるまでこれが繰り返されます。残りの半分が空の状態で検索が終了した場合、ターゲットは配列に含まれていません。アイデアは単純ですが、バイナリ検索を正しく実装するには、特に配列の値が範囲内の整数のすべてではない場合、終了条件と中間点の計算に関する微妙な点に注意する必要