【BZOJ1857】[Scoi2010]传送带【三分套三分】

原创 2016年05月30日 15:58:36

【题目链接】

好像是比较经典的题了。

第一次在考场上写三分orz。

/* Telekinetic Forest Guard */
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdlib>

using namespace std;

typedef double DB;

const DB eps = 1e-6;

struct po {
	DB x, y;
} A, B, C, D, AB, DC;

DB P, Q, R, lenAB, lenCD;

inline int iread() {
	int f = 1, x = 0; char ch = getchar();
	for(; ch < '0' || ch > '9'; ch = getchar()) f = ch == '-' ? -1 : 1;
	for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
	return  f * x;
}

inline DB dis(po a, po b) {
	return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}

inline bool dcmp(po a, po b) {
	return fabs(a.x - b.x) < eps && fabs(a.y - b.y) < eps;
}

inline DB getres(po X) {
	if(dcmp(C, D)) return dis(X, D) / R;
	po l = D, r = C;
	while(!dcmp(l, r)) {
		DB len = dis(l, r) / 3.0;
		po p1 = (po){l.x + DC.x * len, l.y + DC.y * len};
		po p2 = (po){l.x + DC.x * len * 2, l.y + DC.y * len * 2};
		DB res1 = dis(X, p1) / R + dis(p1, D) / Q;
		DB res2 = dis(X, p2) / R + dis(p2, D) / Q;
		if(res1 < res2) r = p2;
		else l = p1;
	}
	return dis(X, l) / R + dis(l, D) / Q;
}

int main() {
	A.x = iread(); A.y = iread(); B.x = iread(); B.y = iread();
	C.x = iread(); C.y = iread(); D.x = iread(); D.y = iread();
	P = iread(); Q = iread(); R = iread();

	lenAB = dis(A, B); lenCD = dis(C, D);
	AB = (po){(B.x - A.x) / lenAB, (B.y - A.y) / lenAB};
	DC = (po){(C.x - D.x) / lenCD, (C.y - D.y) / lenCD};

	if(dcmp(A, B)) {
		if(dcmp(C, D)) printf("%.2f\n", dis(A, D) / R);
		else printf("%.2f\n", getres(A));
		return 0;
	}

	DB ans;
	po l = A, r = B;
	while(!dcmp(l, r)) {
		DB len = dis(l, r) / 3.0;
		po p1 = (po){l.x + AB.x * len, l.y + AB.y * len};
		po p2 = (po){l.x + AB.x * len * 2, l.y + AB.y * len * 2};
		DB res1 = dis(A, p1) / P + getres(p1);
		DB res2 = dis(A, p2) / P + getres(p2);
		if(res1 < res2) ans = res1, r = p2;
		else ans = res2, l = p1;
	}

	printf("%.2f\n", ans);
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Bzoj1857:[Scoi2010]传送带:三分

题目链接[Scoi2010]传送带 首先由猜测法证得函数具有下凸性QwQ 然后就可以三分辣 #include #include #include #include #include using ...

BZOJ 1857 SCOI 2010 传送带 三分法

题目大意:给出平面上两条线段,在这两条线段上走有一定的速度,在其他的平面上走也有一定的速度,问从A点到D点最少需要多少时间。 思路:好像是三分吧,大概感受一下吧,反正也不会证。 C...

bzoj1857 [Scoi2010]传送带 [三分套三分]

Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段。两条传送带分别为线段AB和线段CD。lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动...

BZOJ 1857 SCOI 2010 传送带 三分套三分

分别三分离开AB的点和到达CD的点 传说中的三分套三分。 可以考虑写函数指针节省代码 注意到如果已知AB点到目标点的最小距离,那么这些最小距离组成的是凸函数,对于CD亦是,我们可以采用三分取得极...

BZOJ 1857 [Scoi2010]传送带 三分套三分

BZOJ 1857 [Scoi2010]传送带 三分套三分
  • wzq_QwQ
  • wzq_QwQ
  • 2015年09月24日 07:48
  • 1050

【模版】bzoj1857[Scoi2010]传送带 三分套三分

题意:平面内有两条线段,在两条线段上的速度v1,v2,其他地方速度为v0,求从一条线段起点到另一条线段的终点的最短时间。 题解:从一个点出发到另一条线段的终点的时间是凹函数(证明略。三分套三分。第一...
  • yxr0105
  • yxr0105
  • 2016年05月13日 14:07
  • 177

【BZOJ 1857】【SCOI2010】传送带 【三分套三分】

Description在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段。两条传送带分别为线段AB和线段CD。lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R...

bzoj1857 传送带 三分

很早看到的三分法,竟然在今天用到了(显然已我的智商是想不到的)。然而发现自己并不会证明o(╯□╰)o,但是除了最关键的一步其它还是会的>_        首先,我们用三分法,最基本的是要证明那个人一定...

BZOJ 1857: [Scoi2010]传送带

题意:在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段。两条传送带分别为线段AB和线段CD。lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R。现在lxhgw...

【BZOJ 1857】【SCOI 2010】传送带

做两次三分,第一次三分第一条线段上走出去的点,第二次三分第二条线段上到达的点。 证明这里就不写了,一堆三角函数。。。。反正一阶导数求出来一个过原点的二次函数,一开始是正,后来变成负,所以原函数是个凹...
  • Ripped
  • Ripped
  • 2017年04月17日 15:12
  • 179
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【BZOJ1857】[Scoi2010]传送带【三分套三分】
举报原因:
原因补充:

(最多只允许输入30个字)