직선에 N개의 역이 있다고 가정합니다. 그들 각각은 동일한 음이 아닌 방사선 전력을 가지고 있습니다. 모든 스테이션은 다음과 같은 방법으로 인접 스테이션의 방사 전력을 증가시킬 수 있습니다.
방사선 전력이 R인 스테이션 i가 (i – 1) 스테이션의 방사선 전력을 R-1만큼 증가시키고 (i - 2) 스테이션의 방사선 전력을 R-2만큼 증가시키고 (i + 1) 스테이션의 방사선 전력을 증가시킨다고 가정합니다. R-1에 의한 방사 전력, R-2에 의한 (i + 2)번째 스테이션의 방사 전력. 곧. 예를 들어 배열이 Arr =[1, 2, 3]과 같으면 출력은 3, 4, 4가 됩니다. 새 복사는 [1 + (2 – 1) + (3 – 2), 2 + (1 – 1) + (3 – 1), 3 + (2 – 1)] =[3, 4, 4]
아이디어는 간단합니다. 각 스테이션 i에 대해 위에서 언급한 대로 인접 스테이션의 복사가 증가하여 유효 복사가 음수가 될 때까지입니다.
예시
#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