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
Nhận xét 1: chỉ có duy nhất
truy vấn là nên ta nhận thấy 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ì
càng gần càng tốt. số lần vào là ít nhất (gọi giá trị tăng của là ) => tìm thỏa mãn .
Copy#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