• L3-005 垃圾箱分布


      

    大家倒垃圾的时候,都希望垃圾箱距离自己比较近,但是谁都不愿意守着垃圾箱住。所以垃圾箱的位置必须选在到所有居民点的最短距离最长的地方,同时还要保证每个居民点都在距离它一个不太远的范围内。

    现给定一个居民区的地图,以及若干垃圾箱的候选地点,请你推荐最合适的地点。如果解不唯一,则输出到所有居民点的平均距离最短的那个解。如果这样的解还是不唯一,则输出编号最小的地点。

    输入格式:

    输入第一行给出4个正整数:N(≤)是居民点的个数;M(≤)是垃圾箱候选地点的个数;K(≤)是居民点和垃圾箱候选地点之间的道路的条数;DS​​是居民点与垃圾箱之间不能超过的最大距离。所有的居民点从1到N编号,所有的垃圾箱候选地点从1到GM编号。

    随后K行,每行按下列格式描述一条道路:

    P1 P2 Dist
    

    其中P1P2是道路两端点的编号,端点可以是居民点,也可以是垃圾箱候选点。Dist是道路的长度,是一个正整数。

    输出格式:

    首先在第一行输出最佳候选地点的编号。然后在第二行输出该地点到所有居民点的最小距离和平均距离。数字间以空格分隔,保留小数点后1位。如果解不存在,则输出No Solution

    输入样例1:

    4 3 11 5
    1 2 2
    1 4 2
    1 G1 4
    1 G2 3
    2 3 2
    2 G2 1
    3 4 2
    3 G3 2
    4 G1 3
    G2 G1 1
    G3 G2 2
    

    输出样例1:

    G1
    2.0 3.3
    

    输入样例2:

    2 1 2 10
    1 G1 9
    2 G1 20
    

    输出样例2:

    No Solution


    看错题目了导致比赛的时候死活和样例对不上QAQ
    还有就是 字符转数组居然打反了!!!fuck 导致最后一个点一直wa 打反了前面四个点居然还能wa

    其他没什么好说了 dijkstra模板题
    判断有点麻烦
    #include<bits/stdc++.h>
    using namespace std;
    //input
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m);
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define LL long long
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    #define N 1055
    #define inf 0x3f3f3f3f
    int n,m;
    int mp[N][N];
    int dis[N];
    int vis[N];
    
    void dijkstra(int s)
    {
        memset(vis,0,sizeof vis);
        for(int i=1;i<=n;i++)
            dis[i]=mp[s][i];
    
        dis[s]=0;
        //vis[s]=1;
        for(int i=1;i<=n;i++)
        {
            int minn=inf,u=-1;
            for(int j=1;j<=n;j++)
                if(!vis[j]&&minn>dis[j])
                   minn=dis[u=j];
            if(u==-1)return;
            vis[u]=1;
            for(int j=1;j<=n;j++)
            {
                if(dis[j]>dis[u]+mp[u][j])
                {
                    dis[j]=dis[u]+mp[u][j];
                }
            }
        }
    }
    
    int main()
    {
        int a,b,q,d;
        RIII(a,b,q);RI(d);
        n=a+b;
        rep(i,1,n)
        rep(j,1,n)
        if(i==j)mp[i][j]=0;
        else
            mp[i][j]=inf;
        char s1[10],s2[10];
        int c;
        while(q--)
        {
            int fi,se;
            RS(s1);
            RS(s2);
            RI(c);
            if(s1[0]=='G')
            {
                if(strlen(s1)==3)
                fi=a+10+s1[2]-'0';
                else fi=a+s1[1]-'0';
            }
            else
            {
                int len=strlen(s1);
                int val=0;
                for(int i=0;i<len;i++)//一开始还弄反了!fuck
                val=10*val+s1[i]-'0';
                fi=val;
            }
    
            if(s2[0]=='G')
            {
                if(strlen(s2)==3)
                se=a+10+s2[2]-'0';
                else se=a+s2[1]-'0';
            }
             else
            {
                int len=strlen(s2);
                int val=0;
                for(int i=0;i<len;i++)
                val=10*val+s2[i]-'0';
                se=val;
            }
            if(c<mp[fi][se])
                mp[fi][se]=mp[se][fi]=c;
        }
        double sum;
        double PJ=inf;
        double mind=-1;
        int num=-1;
        int flag=0;
    
        rep(i,a+1,n)
        {
            sum=0;
            int ok=1;
            dijkstra(i);
            int minn=inf;
            rep(j,1,a)
            {
                if(dis[j]>d){ok=0;break;}
                sum+=dis[j];
                minn=min(dis[j],minn);
            }
            if(ok==1)
            {
                flag=1;
                sum/=(a*1.0);
                if(minn>mind)
                {
                    num=i;
                    mind=minn;
                    PJ=sum;
                }
                else if(minn==mind&&sum<PJ)
                {
                    num=i;
                    PJ=sum;
                }
            }
        }
        if(flag)
            printf("G%d
    %0.1lf %0.1lf",num-a,mind,PJ);
        else
            printf("No Solution");
    
        return 0;
    }
    View Code











  • 相关阅读:
    go-web摘抄1-基础知识
    arduino3-机械臂
    Arduino-2 使用按键开关
    Arduino-1 点亮小灯
    树莓派的语音识别
    gitlab的环境搭建及使用
    python数据处理 2
    idea 无法创建class文件
    Intellij IDEA添加database无法显示表等问题
    Intell idea 添加 jd反编译插件
  • 原文地址:https://www.cnblogs.com/bxd123/p/10524443.html
Copyright © 2020-2023  润新知