HDU3400 Line belt 三分法 C语言

题目:http://acm.hdu.edu.cn/showproblem.php?pid=3400

题目大意:给出A、B、C、D四点坐标,在AB上速度为P,CD上速度为Q, 其他地方速度为R。求从A到D的最短时间

思路:两个三分嵌套,AB线段三分,内层嵌套CD线段内的三分

提交情况: WA 1次, AC 1次

总结:内层的三分时,每次都要重新赋两端点的值为C、D的值,因为前一次搜索结束后,端点值已经改变。就这样WA了一次……

 

AC code:

ContractedBlock.gif ExpandedBlockStart.gif View Code
 1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <math.h>
5
6
7 #define EPS 1e-6
8
9 double ax, ay, bx, by, cx, cy, dx, dy;
10 double p, q, r;
11
12 double lmidx, lmidy, lmidmidx, lmidmidy, rmidx, rmidy, rmidmidx, rmidmidy;
13 double lax, lay, lbx, lby, rcx, rcy, rdx, rdy;
14
15 void Insert() {
16 scanf("%lf%lf%lf%lf%lf%lf%lf%lf", &ax, &ay, &bx, &by, &cx, &cy, &dx, &dy);
17 scanf("%lf%lf%lf", &p, &q, &r);
18 lax = ax; lay = ay; lbx = bx; lby = by;
19 }
20
21 double Time(double x1, double y1, double x2, double y2, double v) {
22 double dis, time;
23 dis = sqrt((double)(x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
24 time = (double)dis / v;
25 return (double)time;
26 }
27
28
29 double Find_R(double lx, double ly) {
30 rcx = cx; rcy = cy; rdx = dx; rdy = dy; //每次都要赋值,因为前一次搜索完rcx, rcy, rdx, rdy值已经发生变化
31 double timem = 0, timemm = 1;
32 while(abs(timem - timemm) > EPS) { //求什么就用什么的精度卡
33 rmidx = (rcx + rdx) / 2;
34 rmidy = (rcy + rdy) / 2;
35 rmidmidx = (rmidx + rdx) / 2;
36 rmidmidy = (rmidy + rdy) / 2;
37 timem = Time(ax, ay, lx, ly, p) + Time(rmidx, rmidy, dx, dy, q) + Time(lx, ly, rmidx, rmidy, r);
38 timemm = Time(ax, ay, lx, ly, p) + Time(rmidmidx, rmidmidy, dx, dy, q) + Time(lx, ly, rmidmidx, rmidmidy, r);
39 if(timem <= timemm) {
40 rdx = rmidmidx;
41 rdy = rmidmidy;
42 }
43 else {
44 rcx = rmidx;
45 rcy = rmidy;
46 }
47 }
48 return timem;
49 }
50
51 double Find_L() {
52 double time_m = 0, time_mm = 1;
53 while(abs(time_m - time_mm) > EPS) {
54 lmidx = (lax + lbx) / 2;
55 lmidy = (lay + lby) / 2;
56 lmidmidx = (lmidx + lbx) / 2;
57 lmidmidy = (lmidy + lby) / 2;
58 time_m = Find_R(lmidx, lmidy);
59 time_mm = Find_R(lmidmidx, lmidmidy);
60 if(time_m <= time_mm) {
61 lbx = lmidmidx;
62 lby = lmidmidy;
63 }
64 else {
65 lax = lmidx;
66 lay = lmidy;
67 }
68 }
69 return time_m;
70 }
71
72 int main() {
73 int t;
74 scanf("%d", &t);
75 while(t--) {
76 Insert();
77 printf("%.2lf\n", Find_L());
78 }
79 return 0;
80 }

转载于:https://www.cnblogs.com/cloehui/archive/2011/07/24/2115248.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值