【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;
}


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

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

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

Linux下套接字详解(补充)---- TCP协议中的三次握手和四次挥手(图解)

转载自 TCP协议中的三次握手和四次挥手(图解) 其他写的比较好的 简析TCP的三次握手与四次分手 TCP的三次握手(建立连接)和四次挥手(关闭连接) TCP...
  • gatieme
  • gatieme
  • 2016年03月08日 15:56
  • 2338

Android一整套图片解决方案(fresco三级缓存框架内部已经实现)

原创 2016-09-05 hss01248 鸿洋 鸿洋 鸿洋 微信号 hongyangAndroid 功能介绍 你好,欢迎关注鸿洋的公众号,每天为您推送高质量文章,让你每天都能涨知识。...
  • u011277123
  • u011277123
  • 2016年09月05日 09:17
  • 1571

BZOJ 1857 SCOI 2010 传送带 三分法

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

Bzoj1857:[Scoi2010]传送带:三分

题目链接[Scoi2010]传送带 首先由猜测法证得函数具有下凸性QwQ 然后就可以三分辣 #include #include #include #include #include using ...
  • qq_34025203
  • qq_34025203
  • 2016年04月22日 08:07
  • 296

BZOJ1857 SCOI2010 传送带 三分套三分

大家都很强, 可与之共勉 。题意:   给您两条线段,分别为AB,CDAB,CD(给出A,B,C,DA,B,C,D的坐标),您要从AA走到DD,给出在线段ABAB的移动速度PP,线段CDCD的移动速...
  • simpsonk
  • simpsonk
  • 2017年12月06日 11:35
  • 51

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

Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段。两条传送带分别为线段AB和线段CD。lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动...
  • u011265346
  • u011265346
  • 2015年05月14日 15:13
  • 374

bzoj 1857: [Scoi2010]传送带 三分套三分

题目传送门分析恩NOIP快来了,作为一个没写过三分的弱菜,赶紧找一道三分题写一写,免得到时候写不出来。三分法对于一个上凸函数,若对于Ax,Bx(Ax < Bx),有Ay < By则峰顶必然在(Ax,+...
  • qq_33229466
  • qq_33229466
  • 2016年11月14日 07:26
  • 166

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

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

[BZOJ 1857][SCOI 2010]传送带(三分套三分)

题目链接http://www.lydsy.com/JudgeOnline/problem.php?id=1857思路三分套三分,首先三分在传送带AB上的运动时间,然后在确定了在AB上的运动时间后,三分...
  • qpswwww
  • qpswwww
  • 2015年03月19日 21:12
  • 684
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【BZOJ1857】[Scoi2010]传送带【三分套三分】
举报原因:
原因补充:

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