fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. ll n,k,a[5001],ans=1e14;
  5. /*
  6.   n: số lượng phần tử của mảng
  7.   k: khoảng cách giữa mỗi nốt nhạc
  8.   a[]: mảng chứa n nốt nhạc ban đầu
  9.   ans: thời gian ngắn nhất để biến mảng a[] thành bản nhạc thế kỉ (ans ban đầu bằng infinity cho dễ tìm min)
  10. */
  11. int main() {
  12. ios::sync_with_stdio(false);
  13. cin.tie(0), cout.tie(0);
  14. // nhập dữ liệu theo đề bài
  15. cin >> n >> k;
  16. for(int i=1;i<=n;i++) cin >> a[i];
  17. // bắt đầu giải
  18. // ta nhận xét rằng bản nhạc thế kỉ phụ thuộc vào a[1]
  19. // vì nếu có a[1] thì những nốt nhạc sau sẽ là a[2] = a[1]+k, a[3] = a[2]+k = a[1] + 2*k ...
  20. for(int i=1;i<=5000;i++) {
  21. // i: giá trị ban đầu của a[1]
  22. ll cnt=0,cur=i;
  23. // cnt: với giá trị a[1] = i thì sẽ cần ít nhất bao nhiêu thời gian để biến mảng a[] thành bản nhạc TK
  24. // cur: giá trị của nốt nhạc hiện tại đang xét tới (cur ban đầu là a[1] nên cur = i)
  25. for(int j=1;j<=n;j++) {
  26. cnt+=abs(a[j]-cur), cur+=k;
  27. // với mỗi giá trị cur hiện tại, ta cần biến đổi a[j] = cur mà mỗi lần ta chỉ đc +1 hoặc -1 cho a[j]
  28. // suy ra nếu a[j] > cur thì cnt += a[j]-cur ngược lại cur > a[j] thì cnt += cur - a[j]
  29. // vậy cnt += trị tuyệt đối (a[j] - cur)
  30. // mỗi lần tính xong ta sẽ đi tiếp đến giá trị a[j+1] mà theo đề bài a[j+1] = a[j] + k
  31. // vậy cur += k sau mỗi lần tính
  32. }
  33. // kiểm tra xem cnt có bé hơn ans hay không?
  34. ans=min(ans,cnt);
  35. }
  36. cout << ans;
  37. return 0;
  38. }
Success #stdin #stdout 0.01s 5320KB
stdin
5 1
2 1 3 4 5
stdout
2