传送门

#include<bits/stdc++.h>
#define qwq long long //自定义
using namespace std;
const int N=1010; //常量
int n,r[N]; //定义
int shortest_route(int i){ //寻找当前所用距离
	int sum=0; //记录当前所用距离
	for(int j=0;j<n;j++){ //遍历
		sum+=j*r[(i+j)%n]; //推出来的公式
	}
	return sum; //返回当前所用距离
}
int main(){
//	freopen("cbarn.in","r",stdin);	io比赛
//	freopen("cbarn.out","w",stdout);	io比赛
	cin>>n; //输入
	for(int i=0;i<n;i++) cin>>r[i];	//输入
	int res=INT_MAX; //用来找最小值,INT_MAX是指int的最大范围
	for(int i=0;i<n;i++){ //n的范围只有100,可以直接暴力
		res=min(res,shortest_route(i)); //去比较每个入口要走的距离
	}
	cout<<res;
	return 0;
}

公式:

设 i,j 下标的起始都为 0,第 i 个牛棚中所需要的牛为 xi

i 为牛棚的位置

j 可以看成是当前开的外侧的门相对于 0 号外门的逆时针偏移量

(i + j) 可以看作是第 i 个牛棚到距离 0 号位置逆时针 j 个距离的距离

由于是一个环,会绕回到原地,距离其实为0,但 (i + j) 会等于 n 所以距离为 (i + j) % n

例如 j = 1 时:

0 号位置相对于 4 号位置的距离为 (0 + 1) % 5 = 1

1 号位置相对于 4 号位置的距离为 (1 + 1) % 5 = 2

2 号位置相对于 4 号位置的距离为 (2 + 1) % 5 = 3

3 号位置相对于 4 号位置的距离为 (4 + 1) % 5 = 4

4 号位置相对于 4 号位置的距离为 (4 + 1) % 5 = 0

2 条评论

  • @ 2024-10-10 21:03:37

    3 号位置相对于 4 号位置的距离不应该是(3+1)%5=4吗?

    • @ 2024-10-10 20:34:44

      发这里干嘛

      • 1