zoukankan      html  css  js  c++  java
  • 1065. Frontier 夜

    http://acm.timus.ru/problem.aspx?space=1&num=1065

    分两种情况

    1,M==0 的情况 这时枚举任意三个点(不共线) 算长度 取最短

    2,M!=0  的情况 这时枚举任意点到其它每个点的距离 比如说从i到j 距离 如果所有的M个点都在从i到j向量的右面

        则距离可以直接求出 否则暂时为无穷大 然后用 floyd求最短路 最后求最小的环形路

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<map>
    #include<vector>
    #include<stack>
    #include<set>
    #include<map>
    #include<queue>
    #include<deque>
    #include<algorithm>
    #include<cmath>
    #define LL long long
    //#pragma comment(linker, "/STACK:1024000000,1024000000")
    using namespace std;
    const double eps=1e-9;
    const int INF=0x3f3f3f3f;
    const double FINF=1e12;
    const int N=1005;
    const int M=55;
    int n,m;
    int x[N+M],y[N+M];
    double dist[M][M];
    double Fdist(int i,int  j)
    {
        return sqrt(1.0*(x[j]-x[i])*(x[j]-x[i])+(y[j]-y[i])*(y[j]-y[i]));
    }
    int main()
    {
        //freopen("data.in","r",stdin);
        cin>>n>>m;
        for(int i=0;i<n;++i)
        cin>>x[i]>>y[i];
        for(int i=n;i<n+m;++i)
        cin>>x[i]>>y[i];
        if(m==0)
        {
            double ans=FINF;
            for(int i=0;i<n;++i)
            for(int j=0;j<n;++j)
            for(int l=0;l<n;++l)
            if((x[j]-x[i])*(y[l]-y[i])-(x[l]-x[i])*(y[j]-y[i])!=0)
            ans=min(ans,Fdist(i,j)+Fdist(i,l)+Fdist(j,l));
            printf("%.2f\n",ans);
            return 0;
        }
        for(int i=0;i<n;++i)
        for(int j=0;j<n;++j)
        dist[i][j]=FINF;
        for(int i=0;i<n;++i)
        {
            bool flag=true;
            for(int j=i+1;flag;++j)
            {
                if(j==n) j=0;
                if((i-j+n)%n==1) break;
                for(int l=n;l<n+m;++l)
                {
                    if((x[j]-x[i])*(y[l]-y[i])-(x[l]-x[i])*(y[j]-y[i])>=0)
                    {flag=false;break;}
                }
                if(flag)
                dist[i][j]=Fdist(i,j);
            }
        }
        for(int l=0;l<n;++l)
        for(int i=0;i<n;++i)
        for(int j=0;j<n;++j)
        if(dist[i][l]+dist[l][j]<dist[i][j])
        dist[i][j]=dist[i][l]+dist[l][j];
        double ans=FINF;
        for(int i=0;i<n;++i)
        ans=min(ans,dist[i][i]);
        printf("%.2f\n",ans);
        return 0;
    }
    

      

  • 相关阅读:
    TechRoad_oneStep_0509
    TechRoad_0417
    [Network] 判断设备是否能访问 Internet
    云原生相关知识点
    Algorithm: 多项式乘法 Polynomial Multiplication: 快速傅里叶变换 FFT / 快速数论变换 NTT
    Mac下配置Apache服务器
    解决antdv 中input每输入一个字符就失去焦点
    *装饰者模式(Decorator)
    *单例模式(singleton)
    ubuntu20.04 线缆已拔出
  • 原文地址:https://www.cnblogs.com/liulangye/p/2932233.html
Copyright © 2011-2022 走看看