saxiy @ 2019-09-22 15:23:25
被最后一个点hack数据气到了随手乱码了一个比较函数就过了。。。
我重新思考人类的本质
#pragma GCC optimize("fast-math,unroll-loops")
#include <bits/stdc++.h>
#define N 200005
using namespace std;
struct point {
double x, y;
void in() { scanf("%lf%lf", &x, &y); }
} p[N];
struct OPX {
bool operator() (const point &a, const point &b) const {
return a.x == b.x ? a.y < b.y : a.x < b.x;
}
};
struct OPY {
bool operator() (const point &a, const point &b) const {
return a.y == b.y ? a.x < b.x : a.y < b.y;
}
};
struct OPXX { //随手乱码的比较函数
bool operator() (const point &a, const point &b) const {
return a.x - b.x < a.y - b.y;
}
};
int n; double ans = DBL_MAX;
inline double p2(double x) { return x * x; }
inline double mhdis(const point &a, const point &b) {
return p2(a.x - b.x) + p2(a.y - b.y);
}
void solve() {
for(int i = 1;i < n;i++)
ans = min(ans, mhdis(p[i], p[i - 1]));
}
int main() {
scanf("%d", &n);
for(int i = 0;i < n;i++) p[i].in();
sort(p, p + n, OPX());
solve();
sort(p, p + n, OPY());
solve();
sort(p, p + n, OPXX());
solve();
printf("%.4f", sqrt(ans));
return 0;
}
我觉得这题要拦无脑贪心是不可能的(就跟淬火一样),次优解要多少有多少。。最后就是调排序函数的事情。。 (大不了random_shuffle)
by _兰_ @ 2019-09-22 15:33:53
嗯…构造数据的时候如果随机撒圆心,然后确定半径在圆周上随机撒点,应该会强一些吧?
还有关于您的第三个cmp,如果不加绝对值符号的话,卡掉应该很简单吧?(0,4),(4,0),(-7,-7),(10,10)就卡掉了吧……
by _兰_ @ 2019-09-22 15:38:30
6
4 0
0 4
-7 -7
10 10
-100 2
2 100
然后这个贪心其实还是很好卡的,刚才忘记还有两个cmp了
然后还有,就是随机排列的话命中概率低得很⑧
by SSerxhs @ 2019-09-22 15:40:15
有必要吗...
像第一篇题解那样随机转角就好了
by saxiy @ 2019-09-22 15:43:06
但是这种贪心简单无脑啊,转角还有三角函数呢。
by saxiy @ 2019-09-22 15:46:47
主要是跑得快。。。
by 142857cs @ 2019-09-22 15:48:29
。。。
by 142857cs @ 2019-09-22 15:48:44
有必要吗。。。
by saxiy @ 2019-09-22 15:49:04
开个玩笑,肯定不可能用random_shuffle的,大概就是找近距离点的关系规律排个序吧。。要是能骗到90pts+也不错啊。。