如果你模拟退火写的是交换两个点,不用调参就可过。当然,参数不能设的太离谱。
你只需要实现优秀一点,把交换后求答案改成 O(1) 的就行。像这样:
int tmp = ans;
tmp -= gt(x1, y1), tmp -= gt(x2, y2);
swap(a[x1][y1], a[x2][y2]);
tmp += gt(x1, y1), tmp += gt(x2, y2);
gt(x, y) 是统计一个格子贡献的函数。注意你随出来的两个格子 不能相邻。
另外需要注意的是,你可以在模拟退火之后再跑爬山,跑 1000 次就行,注意后面的爬山算法 不能接受更劣解。
本人的参数设置:初始温度 T=10,最低温度 t=10−15,降温系数 d=0.9999。
本人还加了卡时,卡时时限为 4.5 秒,但似乎有点过于保守了。
提交记录。