Cho mảng chứa số dương và âm đại diện cho các trạm kiểm soát dọc đường phố. Số dương tăng năng lượng, số âm giảm. Cần tìm năng lượng khởi tạo sao cho năng lượng không bao giờ ≤ 0.
Ví dụ: A = {4, -6, 2, 3}. Năng lượng ban đầu 0: sau trạm 1 là 4, trạm 2 là -2 (≤0). Cần khởi tạo 3: sau trạm 1 là 7, trạm 2 là 1.
Thuật toán
nangLuongKhoiTaoToiThieu(arr, n):
bắt đầu
initEnergy := 0
currEnergy := 0
flag := false
cho i từ 0 đến n, làm
currEnergy := currEnergy + arr[i]
nếu currEnergy <= 0, thì
initEnergy := initEnergy + |currEnergy| + 1
currEnergy := 1
flag := true
kết thúc nếu
kết thúc
nếu flag là false, trả về 1, ngược lại trả về initEnergy
kết thúc
Ví dụ mã C++
#include <iostream>
#include <cmath>
using namespace std;
int nangLuongKhoiTaoToiThieu(int arr[], int n){
int initEnergy = 0;
int currEnergy = 0;
bool flag = false;
for (int i = 0; i < n; i++){
currEnergy = currEnergy + arr[i];
if (currEnergy <= 0){
initEnergy = initEnergy + abs(currEnergy) + 1;
currEnergy = 1;
flag = true;
}
}
if (flag == false)
return 1;
else
return initEnergy;
}
int main() {
int A[] = {4, -6, 2, 3};
int n = sizeof(A)/sizeof(A[0]);
cout << "Năng lượng tối thiểu: " << nangLuongKhoiTaoToiThieu(A, n);
}
Kết quả đầu ra
Năng lượng tối thiểu: 3