蓝桥-ALGO-25-Car的旅行路线

来源:互联网 发布:plc的编程语言主要有 编辑:程序博客网 时间:2024/05/04 10:51

ACM模版

描述

描述

题解

说起蓝桥杯,虽然现在搞得越来越大了,可是一点不走心,官网的 OJ 做得垃圾透了,好好一个题给的样例都是错的,真是扯啊~~~

这个题其实就是一个建图+Floyd,建图比较麻烦一点,其中比较核心的是已知三点求矩形第四点,这个我用的是先求出三角形的直角顶点,然后根据一个公式 x4=x2+x3x1,y4=y2+y3y1 来求到点 4,点 1 调整为直角顶点即可。

WA 了一发,因为我习惯看样例保留了两个小数,而题目要求保留一位……还有,样例输入的第一个 1 是 case 数吗?简直搞笑,还有样例里的 s 竟然是 1?我想吐槽,我也吐了~~~

代码

#include <iostream>#include <cstring>#include <cmath>using namespace std;const int MAXN = 1111;const int MAXS = 111;const int INF = 0x3f3f3f3f;struct city{    int x[4], y[4];    int t;} C[MAXS];int s, t, A, B;double cost[MAXN][MAXN];double lowcost[MAXN][MAXN];double getCost(int x1, int y1, int x2, int y2, int t){    return sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2)) * t;}void Floyd(int n){    memcpy(lowcost, cost, sizeof(cost));    for (int k = 0; k < n; k++)    {        for (int i = 0; i < n; i++)        {            for (int j = 0; j < n; j++)            {                if (lowcost[i][j] > lowcost[i][k] + lowcost[k][j])                {                    lowcost[i][j] = lowcost[i][k] + lowcost[k][j];                }            }        }    }}void get_fourth_node(int x1, int y1, int x2, int y2, int x3, int y3, int &x4, int &y4){    if ((x1 - x2) * (x3 - x2) + (y1 - y2) * (y3 - y2) == 0)    {        swap(x1, x2);        swap(y1, y2);    }    else if ((x1 - x3) * (x2 - x3) + (y1 - y3) * (y2 - y3) == 0)    {        swap(x1, x3);        swap(y1, y2);    }    x4 = x2 + x3 - x1;    y4 = y2 + y3 - y1;}int main(int argc, const char * argv[]){    memset(cost, 0x3f, sizeof(cost));    cin >> s >> t >> A >> B;    if (A == B)    {        printf("0.0\n");        return 0;    }    for (int i = 0; i < s; i++)    {        cin >> C[i].x[0] >> C[i].y[0];        cin >> C[i].x[1] >> C[i].y[1];        cin >> C[i].x[2] >> C[i].y[2];        cin >> C[i].t;        get_fourth_node(C[i].x[0], C[i].y[0], C[i].x[1], C[i].y[1], C[i].x[2], C[i].y[2], C[i].x[3], C[i].y[3]);        for (int j = 0; j < 4; j++)        {            for (int k = j + 1; k < 4; k++)            {                cost[i * 4 + j][i * 4 + k] = cost[i * 4 + k][i * 4 + j] =                        getCost(C[i].x[j], C[i].y[j], C[i].x[k], C[i].y[k], C[i].t);            }        }    }    for (int i = 0; i < s; i++)    {        for (int j = i + 1; j < s; j++)        {            for (int k = 0; k < 4; k++)            {                for (int l = 0; l < 4; l++)                {                    cost[i * 4 + k][j * 4 + l] = cost[j * 4 + l][i * 4 + k] =                    getCost(C[i].x[k], C[i].y[k], C[j].x[l], C[j].y[l], t);                }            }        }    }    Floyd(4 * s);    double res = INF;    for (int i = 0; i < 4; i++)    {        for (int j = 0; j < 4; j++)        {            res = min(res, lowcost[A * 4 - 4 + i][B * 4 - 4 + j]);        }    }    printf("%.1f\n", res);    return 0;}
原创粉丝点击