Hướng dẫn giải của Increase Array
Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Tác giả:
Yêu cầu của bài toán: cho dãy ~B~ gồm n phần tử và giá trị ~d~ và biến dãy ~B~ thành dãy tăng với truy vấn chọn một phần tử của dãy số và cộng thêm ~d~ vào.
Nhận xét 1: chỉ có duy nhất ~1~ truy vấn là ~+ d~ nên ta nhận thấy ~B_1~ sẽ là giá trị nhỏ nhất của cả dãy.
Nhận xét 2: để số thao tác là ít nhất thì ~B_i - B_{i - 1}~ càng gần ~0~ càng tốt. ~\Rightarrow~ số lần ~+d~ vào là ít nhất (gọi giá trị tăng của ~B_i~ là ~X~ ~\Rightarrow~ ~X = k \times d~) => tìm ~k_{min}~ thỏa mãn ~B_{i - 1} < B_i + k \times d~.
~\Rightarrow~ ~k_{min}~ ~=~ ~\frac{B{i - 1} - B_i + 1}{d} + ((B_{i - 1} - B_i + 1)~ ~\%~ ~d \neq 0)~.
#include <bits/stdc++.h> using namespace std; const int maxn = 1e6 + 3; int n, d; long long a[maxn], ans; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); #define NAME "" if(fopen(NAME".INP", "r")){ freopen(NAME".INP", "r", stdin); freopen(NAME".OUT", "w", stdout); } cin >> n >> d; for(int i = 1; i <= n; i++) cin >> a[i]; for(int i = 2; i <= n; i++){ if(a[i] <= a[i - 1]){ int t = (a[i - 1] - a[i] + 1) / d + ((a[i - 1] - a[i] + 1) % d != 0); t = max(t, 1); a[i] += 1LL * t * d; ans += t; } } cout << ans; return 0; }
Bình luận