题目大意:给定n*m的方格,每个格子中有一些“星之器”,可以移动同一行或同一列的不相邻两个星之器,使它们互相向对方的方向移动一格,这个过程中会获得“它们原本隔着的格子数量”数值的魔力。给出初末状态,求获得魔力最大值
n,m<=200,每个格子中数量<=1000,保证合法
题解神思路,给跪了。设每个星之器的势能为横纵坐标平方和,则每次移动所获得的魔力即为势能变化量的一半,直接初末状态能量守恒即可。并且由此看出,能获得的魔力是定值,故无所谓最大量(这干扰配上这数据范围丧心病狂)
在此膜拜不看题解写出来的神犇。。。
#include<cstdio>
#define rep(i,n) for(int i=1;i<=n;++i)
#define cin(x) scanf("%d",&x)
#define gm 201
using namespace std;
int n,m;
int a[gm][gm],v;
long long sum=0;
int main()
{
scanf("%d%d",&n,&m);
rep(i,n) rep(j,m) cin(a[i][j]);
rep(i,n) rep(j,m) cin(v),sum+=(long long)(a[i][j]-v)*(i*i+j*j);
printf("%lld\n",sum>>1);
return 0;
}

本文介绍了一种新颖的方法来解决一个特定问题:如何通过计算星之器在给定方格内的势能变化来确定可获得的最大魔力值。通过将问题转化为能量守恒的形式,实现了高效准确的解答。
1675

被折叠的 条评论
为什么被折叠?



