码迷,mamicode.com
首页 > 其他好文 > 详细

【BZOJ 1857】【SCOI 2010】传送带

时间:2016-06-22 18:47:12      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:

三分套三分,虽然简单,但是也得掌握,,,

时间复杂度$O(log_{1.5}^2 n)$

一开始WA好几次发现是快速读入里没有return,这样也能过样例?

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const double eps = 1e-3;
int in() {
	int k = 0, fh = 1; char c = getchar();
	for(; c < ‘0‘ || c > ‘9‘; c = getchar())
		if (c == ‘-‘) fh = -1;
	for(; c >= ‘0‘ && c <= ‘9‘; c = getchar())
		k = (k << 3) + (k << 1) + c - ‘0‘;
	return k * fh;
}

double p, q, r;
struct Point {
	double x, y;
} A1, A2, B1, B2;

double sqr(double x) {return x * x;}

double dis(Point A, Point B) {return sqrt(sqr(A.x - B.x) + sqr(A.y - B.y));}

double cal(Point B) {
	double c1, c2;
	Point P1 = B1, P2 = B2, x1, x2;
	while (fabs(P1.x - P2.x) > eps || fabs(P1.y - P2.y) > eps) {
		x1 = (Point) {P1.x + (P2.x - P1.x) / 3, P1.y + (P2.y - P1.y) / 3};
		x2 = (Point) {P1.x + (P2.x - P1.x) * 2 / 3, P1.y + (P2.y - P1.y) * 2 / 3};
		c1 = dis(B, x1) / r + dis(x1, B2) / q, c2 = dis(B, x2) / r + dis(x2, B2) / q;
		if (c1 < c2) P2 = x2;
		else P1 = x1;
	}
	
	return dis(B, P1) / r + dis(P1, B2) / q;
}

int main() {
	A1.x = in(); A1.y = in(); A2.x = in(); A2.y = in();
	B1.x = in(); B1.y = in(); B2.x = in(); B2.y = in();
	p = in(); q = in(); r = in();
	
	double c1, c2;
	Point P1 = A1, P2 = A2, x1, x2;
	while (fabs(P1.x - P2.x) > eps || fabs(P1.y - P2.y) > eps) {
		x1 = (Point) {P1.x + (P2.x - P1.x) / 3, P1.y + (P2.y - P1.y) / 3};
		x2 = (Point) {P1.x + (P2.x - P1.x) * 2 / 3, P1.y + (P2.y - P1.y) * 2 / 3};
		c1 = dis(A1, x1) / p + cal(x1), c2 = dis(A1, x2) / p + cal(x2);
		if (c1 < c2) P2 = x2;
		else P1 = x1;
	}
	
	printf("%.2lf\n", dis(A1, P1) / p + cal(P1));
	return 0;
}

期末考试Bless All!

【BZOJ 1857】【SCOI 2010】传送带

标签:

原文地址:http://www.cnblogs.com/abclzr/p/5608036.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!