题目
在一个大小为 n×n 网格的森林里,每个格子中,都放有一个宝藏,其中 n 是奇数。
求把这些宝藏都集中到同一个单元格中的最小移动次数。
在一次移动中,可以选择某个单元格中的一个宝藏,将其移动到相邻的 8 个格子中的一个。
不能将宝藏移出森林。
解题思路
将所有宝藏都移动到网格的最中心的位置。
中心的相邻的第 1 层有 2 * 4 = 8 个格子,每个格子移动到中心的最少次数都是 1。
中心的相邻的第 2 层有 4 * 4 = 16 个格子,每个格子移动到中心的最少次数都是 2。
依此类推,中心的相邻的第 i 层有 (2 * i) * 4 个格子,每个格子移动到中心的最少次数都是 i,这些格子移动总次数为 8 * i * i。
一共有 (n-1)/2 层。
将这些距离相加即为所求。
C++代码
#include<iostream>
using namespace std;
int main(){
int t, n;
cin >> t;
while(t--){
cin >> n;
long long ans = 0;
int k = (n-1)/2;
for(int i=1; i<=k; ++i){
ans += 8LL*i*i;
}
cout << ans << endl;
}
return 0;
}
京公网安备 11010502036488号