原题链接
https://ac.nowcoder.com/acm/contest/33190/A
题目大意
在二维平面上,有 n ( 1 ≤ n ≤ 2000 ) n(1 \leq n \leq 2000) n(1≤n≤2000) 个位置有食物。从原点出发,每次直线前往其他任意一个有食物的位置收集食物。收集完后再次前往下一个点。每当离开一个有食物的点后,该点的食物最后刷新。并且每次的移动距离必须严格下降。
求最多可以收集到多少食物。
题解
由题目得,所经过的路径需要递减,如果直接考虑状态的话本蒟蒻难以下手,
根据“正难则反”,我们考虑一下反着思考,只需要最后一个点是原点即可,思路就清晰多了。
我们只需要从大到小将边长进行排序,尽可能选择较大的边遍历即可。
如果有相同边长的边,我们需要将其共同进行储存结果计算即可,再进行新的计算。
代码的复杂度在 O ( n 2 l o g n 2 ) O(n^2logn^2) O(n2logn2) sort牛逼,
边长的计算需要用欧拉公式记录。
参考代码
#include<bits/stdc++.h>
#define FOR(i,n,m) for(int i=n;i