2019ACM陕西省省赛题目笔记 #2 D - Pick Up [ZOJ - 4129]

2019ACM陕西省省赛题目笔记 #2 D题

D - Pick Up ZOJ-4129


  • 题解思路:因为题目只能横着走和竖着走,然后根据小学那啥,这个线路的平移。
    我们发现,我们可以通过平移,将A-C和B-C的最短路贴合在一起一部分。
    在A-B所构成的矩形中我们找到离C最近的点设为D。使两人往D点走。再判断:若A先到D点则A继续往C走,若B先到D点则B继续走去接A再去D点。然后这就是最优解。(膜拜写题解大佬)
  • 错误点:
    • 在写各个公式的时候,确定D点的公式写错了。忽略了其他象限的情况。导致一直出错。
    • 还有计算B去接A的情况的用时时我写了四个公式才理清楚。物理和数学(?)问题,不具体分析。

  • 代码
#include
#include
#include
using namespace std;

int main() {
    int a,b;    // 速度
    int xa,ya,xb,yb,xc,yc;
    int xd,yd;  // 中继点
    double tim[3]; //tim[2]是我用来dbug的 实际只有两个 A自己去花的时间 B接他花的时间
    int T;
    scanf("%d",&T);
    while(T--) {
        scanf("%d %d",&a,&b);
        scanf("%d %d %d %d %d %d",&xa,&ya,&xb,&yb,&xc,&yc);
        tim[0] = (abs(xc-xa)+abs(yc-ya)) * 1.0 / a;
        
        //--------------------------------------------计算D点坐标
        /**
         *解释下我找D点的思路
         *C点X坐标在AB之间,则D点就在C点垂下来的地方
         *C点Y坐标在AB之间,则D点就在C点垂下来的地方
         *C点坐标在AB范围外,则D点在A-B矩形离其最近的那个顶点
         **/
        if(xc>min(xa,xb) && xc<max(xa,xb)) {
            xd = xc;
        }else {
            if(abs(xc-xa)<abs(xc-xb)) {
                xd = xa;
            }else {
                xd = xb;
            }
            // 错误公式示范
            // xd = xc - min(abs(xc-xa),abs(xc-xb));
        }
        if(yc>min(ya,yb) && yc<max(ya,yb)) {
            yd = yc;
        }else {
            if(abs(yc-ya)<abs(yc-yb)) {
                yd = ya;
            }else {
                yd = yb;
            }
            // 错误公式示范
            // yd = yc - min(abs(yc-ya),abs(yc-yb));
        }
        //------------------------------------------------------------------------
        
        double tempa = (abs(xa-xd)+abs(ya-yd)); // A-D距离
        double tempb = (abs(xb-xd)+abs(yb-yd)); // B-D距离
        if(tempa/a <= tempb/b) {                // 如果A先到D点
            tim[1] = (abs(xb-xc)+abs(yb-yc)) * 1.0 / b;
        }else {                                 // 否则
            tim[1] = (tempa - (tempb/b*a)) / (a+b) * 2.0 + (abs(xb-xc)+abs(yb-yc)) * 1.0 / b;
        }
        printf("%.7f\n",tim[0]>tim[1]?tim[1]:tim[0]);
    }
    return 0;
}

你可能感兴趣的:(2019ACM陕西省赛,ACM比赛补题笔记)