样例能过但0pts求助,悬一关
  • 板块UVA1303 Wall
  • 楼主Stevehim
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/9/13 10:13
  • 上次更新2023/11/2 21:06:42
查看原帖
样例能过但0pts求助,悬一关
759274
Stevehim楼主2023/9/13 10:13
#include <bits/stdc++.h>
#define maxn 100010
#define eps 1e-7
//是否就是凸壳 往外延伸了L
using namespace std;
const double pi = acos(-1);
int n, L;
struct node { //表示坐标点
	double x, y;
	node () {}
	node(double a, double b) : x(a), y(b) {}
	bool operator < (const node &a) const {
		if (x != a.x) return x < a.x; //先按照横坐标排序
		return y < a.y; //再按照纵坐标排序
	}
	node operator - (const node &a) const {
		return node(x - a.x, y - a.y); //这里是返回向量
	}
} p[maxn], ps[maxn], p2[maxn];

int cmp(double x) {
	if (fabs(x) < eps) return 0;
	return x > 0 ? 1 : -1;
}

double dis(node a, node b) {
	return sqrt(abs(a.x - b.x) * abs(a.x - b.x) + abs(a.y - b.y) * abs(a.y - b.y));
}

double cp(node a, node b) { //叉积操作
	return a.x * b.y - a.y * b.x;
}

int andrew() {
	sort(p + 1, p + 1 + n);
	int len = 0;
	for (int i = 1; i <= n; i++) {
		while (len > 1 && cmp(cp(ps[len] - ps[len - 1], p[i] - ps[len - 1])) < 0)
			len--; //将向量进行比对
		ps[++len] = p[i];
	}
	//因为比较的是要插的点和没插的点的向量
	int k = len;
	for (int i = n - 1; i >= 1; i--) { //再扫一遍
		while (len > k && cmp(cp(ps[len] - ps[len - 1], p[i] - ps[len - 1])) < 0)
			len--;
		ps[++len] = p[i];
	}
	return len;
}
double ans;
int t;
char ch;
int main() {
	ios::sync_with_stdio(false);
	scanf("%d", &t);
	while (t--) {
		ans = 0;
		scanf("%d %d", &n, &L);
		for (int i = 1; i <= n; i++)
			cin >> p[i].x >> p[i].y; //还是cin吧
		int tmp = andrew();
//		cout <<tmp << endl;
		for (int i = 1; i < tmp - 1; i++)
			ans += dis(ps[i], ps[i + 1]);
		ans += dis(ps[1], ps[tmp - 1]);
		ans += 2.0 * pi * L;
		if(t) printf("%.0lf\n\n", ans);
		else printf("%.0lf\n",ans);
	}
	return 0;
}
2023/9/13 10:13
加载中...