Cho mảng candies[] độ dài 'size'. Mỗi candies[i] là số kẹo loại i. Mục tiêu mua nhiều kẹo nhất với bất kỳ số tiền nào. Điều kiện:
Nếu mua X[i] loại i (0 <= X[i] <= candies[i]), thì với mọi j (1 <= j <= i) ít nhất một điều kiện sau đúng:
X(j) < X(i) (số kẹo loại j ít hơn loại i)
X(j) = 0 (không mua loại j)
Hiểu qua ví dụ.
Đầu vào - Arr[] = {1,3,5,2,6,7}.
Đầu ra - Số kẹo tối đa mua được = 16.
Giải thích - Kẹo mua loại i: {0,3,5,2,6,0}.
Đầu vào - Arr[] = {5,7,7,3,4}.
Đầu ra - Số kẹo tối đa mua được = 10.
Giải thích - Kẹo mua loại i: {0,0,7,3,0}.
Phương pháp chương trình
Mảng nguyên candies[] lưu số kẹo loại i.
Biến 'size' lưu độ dài mảng.
Hàm maxCandies(int arr[], int n) trả về tổng kẹo có thể mua.
Giả sử mua loại cuối: bought = arr[n-1].
Duyệt từ loại倒 số 2: for(i=n-2; i>=0; i--).
Biến x lưu số kẹo loại hiện tại có thể mua: x = min(arr[i], bought-1).
Nếu x > 0 thì cộng vào tổng.
Nếu tổng > bought trước thì bought = x.
Trả về kết quả bought.
Ví dụ
#include <stdio.h>
int maxCandies(int arr[], int n) {
int bought = arr[n - 1];
int total = bought;
// Từ loại倒 số 2
for (int i = n - 2; i >= 0; i--) {
int x = arr[i] < bought - 1 ? arr[i] : bought - 1;
if (x >= 0) {
total += x;
bought = x;
}
}
return total;
}
int main() {
int candies[] = {1, 2, 4, 3, 7};
int size = 5;
printf("Tong kẹo co the mua: %d", maxCandies(candies, size));
return 0;
}
Kết quả
Chạy code cho đầu ra:
Tong kẹo co the mua: 13