作为当代建筑的爱好者,农夫约翰建造了一个完美圆环形状的新牛棚。
牛棚内部有 nn 个房间,围成一个环形,按顺时针编号为 1∼n1∼n,所有相邻房间之间的距离均为 11。
每个房间都既有通向相邻两个房间的门,也有通向牛棚外部的门。
约翰想让第 ii 个房间内恰好有 riri 头牛。
为了让奶牛们有序的进入牛棚,他计划打开一个外门,让牛从该门进入。
然后,每头牛顺时针(即当 i约翰希望通过合理选择打开的门,使得所有奶牛的行走距离之和尽可能小(这里只考虑每头牛进入牛棚以后的行走距离)。
请确定他的奶牛需要行走的最小总距离。

输入格式

第一行包含整数 nn。
接下来 nn 行,包含 r1,…,rnr1,…,rn。

输出格式

输出所有奶牛需要行走的最小总距离。

数据范围

3≤n≤10003≤n≤1000,
1≤ri≤1001≤ri≤100

输入样例:

5 4 7 8 6 4

输出样例:

48

样例解释

最佳方案是让奶牛们从第二个房间进入。

image.png


  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. const int N = 1010;
  6. int r[N];
  7. int s[N];
  8. int n;
  9. int main() {
  10. cin >> n;
  11. for (int i = 0; i < n; ++i) {
  12. cin >> r[i];
  13. s[i+1] = s[i] + r[i];
  14. }
  15. //p0
  16. int p0 = 0;
  17. for (int i = 1; i < n; ++i) p0 += r[i] * i;
  18. int res = p0;
  19. //pi = pi-1 - s[n] + n*ri-1
  20. //pi = p0 - i * s[n] + n * s[i];
  21. for (int i = 1; i < n; ++i) {
  22. int pi = p0 - i * s[n] + n * s[i];
  23. res = min(res,pi);
  24. }
  25. cout << res << endl;
  26. return 0;
  27. }