這個是正確的演算法,但是複雜度可能會卡到 \(o(n^2)\) ,加上每個點最多匹配的臨近點最多15個/30個限制的話複雜度就可以保證了,最多就再做一次增加正確的機率,我確實不行從頭到尾都是隨機的怎麼有人卡得掉。
#includeusing namespace std;
const double pi = acos(-1.0);
struct point p[200000 + 5];
int n;
inline double randomdouble()
inline bool cmp(const point &a, const point &b)
inline double dis(const point &a, const point &b)
double calc(const double &a, double d)
sort(p + 1, p + 1 + n, cmp);
for(int i = 1; i <= n; i++)
return d;
}int main()
分治演算法,雖然每一層裡面都排序,但實際上選出的點並不多。
#includeusing namespace std;
const double inf = 1e36;
const int maxn = 200000;
int n, tmp[maxn];
struct point s[maxn + 5];
bool cmpx(const point &a, const point&b)
bool cmpidy(const int &a, const int &b)
inline double min(const double &a, const double &b)
inline double dist(const int &i, const int &j)
double merge(int left, int right)
return d;
}int main()
效率更高的隨機演算法,但是不能保證正確性因為只取了至多後10個點,假如把這個去掉又有可能被卡成t,不過從旋轉角到旋轉原點都是完全隨機的,多試幾次可能就行了,假如不放心的話可以多calc幾次。
假如取至多後20個點的話應該是極限了,假如後20個點都過不了寧願再重新calc一次吧。
#includeusing namespace std;
const double pi = acos(-1.0);
struct point p[200000 + 5];
int n;
inline double randomdouble()
inline bool cmp(const point &a, const point &b)
inline double dis(const point &a, const point &b)
double calc(const double &a)
sort(p + 1, p + 1 + n, cmp);
double d = 1e36;
for(int i = 1; i <= n; i++)
return d;
}int main()
類似這樣?
#includeusing namespace std;
const double pi = acos(-1.0);
struct point p[200000 + 5];
int n;
inline double randomdouble()
inline bool cmp(const point &a, const point &b)
inline double dis(const point &a, const point &b)
double calc(const double &a, double d)
sort(p + 1, p + 1 + n, cmp);
for(int i = 1; i <= n; i++)
return d;
}int main()
卡了一下常數,有很多多餘的浮點運算。假如把至多後15個點的限制去掉正確性就可以保證了,但是複雜度可能會**,不過這樣子就只需要計算一次就可以了。
#includeusing namespace std;
const double pi = acos(-1.0);
struct point p[200000 + 5];
int n;
inline double randomdouble()
inline bool cmp(const point &a, const point &b)
inline double dis(const point &a, const point &b)
double calc(const double &a, double d)
sort(p + 1, p + 1 + n, cmp);
for(int i = 1; i <= n; i++)
return d;
}int main()
平面最近點對
求點集中的最近點對有以下兩種方法 設p1 x1,y1 p2 x2,y2 pn xn,yn 是平面上n個點構成的集合s,設計演算法找出集合s中距離最近的點對。1 蠻力法 適用於點的數目比較小的情況下 1 演算法描述 已知集合s中有n個點,一共可以組成n n 1 2對點對,蠻力法就是對這n n 1 2 ...
平面最近點對
求點集中的最近點對有以下兩種方法 設p1 x1,y1 p2 x2,y2 pn xn,yn 是平面上n個點構成的集合s,設計演算法找出集合s中距離最近的點對。1 蠻力法 適用於點的數目比較小的情況下 1 演算法描述 已知集合s中有n個點,一共可以組成n n 1 2對點對,蠻力法就是對這n n 1 2對...
平面最近點對
求點集中的最近點對有以下兩種方法 設p1 x1,y1 p2 x2,y2 pn xn,yn 是平面上n個點構成的集合s,設計演算法找出集合s中距離最近的點對。1 蠻力法 適用於點的數目比較小的情況下 1 演算法描述 已知集合s中有n個點,一共可以組成n n 1 2對點對,蠻力法就是對這n n 1 2對...