สมมติว่าเรามีอาร์เรย์ A ที่มีองค์ประกอบ n และอีกค่าหนึ่งคือ d ชาวนาได้จัดเตรียมหญ้าแห้งไว้ในบริษัทแล้ว กอง ith ประกอบด้วยก้อนหญ้าแห้ง A[i] ทุกวันวัวสามารถเลือกที่จะย้ายกองหญ้าแห้งหนึ่งกองไปยังกองที่อยู่ติดกัน วัวสามารถทำได้ในวันที่ไม่ทำอะไรเลย วัวต้องการเพิ่มก้อนหญ้าแห้งในกองแรกใน d วัน เราต้องนับก้อนหญ้าแห้งสูงสุดกองแรก
ดังนั้นหากอินพุตเป็นเช่น d =5; A =[1, 0, 3, 2] จากนั้นผลลัพธ์จะเป็น 3 เพราะในวันแรกจากวันที่ 3 ไปที่วันที่ 2 วันที่สองจะย้ายจากที่ 3 ไปอีกครั้งที่สอง จากนั้นในสองวันถัดไป ผ่านวันที่ 2 ไปที่อันดับแรก
ขั้นตอน
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
a0 := A[0] n := size of A for initialize i := 1, when i < n, update (increase i by 1), do: ai := A[i] w := minimum of ai and d / i a0 := a0 + w d := d - w * i return a0
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h>
using namespace std;
int solve(int d, vector<int> A){
int a0 = A[0];
int n = A.size();
for (int i = 1; i < n; i++){
int ai = A[i];
int w = min(ai, d / i);
a0 += w;
d -= w * i;
}
return a0;
}
int main(){
int d = 5;
vector<int> A = { 1, 0, 3, 2 };
cout << solve(d, A) << endl;
} อินพุต
5, { 1, 0, 3, 2 } ผลลัพธ์
3