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.

Tác giả: nguyenttuca

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

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.