zoukankan      html  css  js  c++  java
  • 传送带

    题目描述

    思路

    三角形两边之和大于第三边

    代码

    #include <cstdio>
    #include <cmath>
    using namespace std;
    struct Node {
    	double x, y;
    } a, b, c, d;
    int p, q, w;
    double getTime(Node a, Node b, int c) {
    	return sqrt(pow(a.x - b.x, 2) + pow(a.y - b.y, 2)) / c;
    }
    double cd(Node z) {
    	Node l, r, midl, midr;
    	double  ansl, ansr, ans;
    	l = c, r = d;
    	while (getTime(l, r, 1) > 1e-4) {
    		midl.x = l.x + (r.x - l.x) / 3.0;
    		midl.y = l.y + (r.y - l.y) / 3.0;
    		midr.x = r.x - (r.x - l.x) / 3.0;
    		midr.y = r.y - (r.y - l.y) / 3.0;
    		ansl = getTime(z, midl, w) + getTime(midl, d, q);
    		ansr = getTime(z, midr, w) + getTime(midr, d, q);
    		if (ansl < ansr) ans = ansl, r = midr;
    		else ans = ansr, l = midl;
    	}
    	return ans;
    }
    double ab() {
    	Node l, r, midl, midr;
    	double ansl, ansr, ans;
    	l = a, r = b;
    	while (getTime(l, r, 1) > 1e-4) {  //两个点之间还有距离的时候
    		midl.x = l.x + (r.x - l.x) / 3.0;
    		midl.y = l.y + (r.y - l.y) / 3.0;
    		midr.x = r.x - (r.x - l.x) / 3.0;
    		midr.y = r.y - (r.y - l.y) / 3.0;
    		ansl = cd(midl) + getTime(midl, a, p);
    		ansr = cd(midr) + getTime(midr, a, p);
    		if (ansl < ansr) ans = ansl, r = midr;
    		else ans = ansr, l = midl;
    	}
    	return cd(l) + getTime(l, a, p); //解决a,b是同一个点的情况
    }
    
    int main() {
    	scanf("%lf %lf %lf %lf", &a.x, &a.y, &b.x, &b.y);
    	scanf("%lf %lf %lf %lf", &c.x, &c.y, &d.x, &d.y);
    	scanf("%d %d %d", &p, &q, &w);
    	printf("%.2lf", ab());
    	return 0;
    }
    
  • 相关阅读:
    原创 动态卷积
    BZOJ1565 植物大战僵尸
    BZOJ1143 [CTSC2008] 祭祀river
    BZOJ3438 小M的作物
    BZOJ3144 [HNOI2013]切糕
    BZOJ2039 [2009国家集训队]employ人员雇佣
    BZOJ1066[SCOI2007]蜥蜴
    BZOJ3874 codevs3361 宅男计划
    Codeforces Round #343 (Div. 2)
    [转]后缀自动机(SAM)
  • 原文地址:https://www.cnblogs.com/liuzz-20180701/p/11583920.html
Copyright © 2011-2022 走看看