zoukankan      html  css  js  c++  java
  • L3-005. 垃圾箱分布

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

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

    输入格式:

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

    随后K行,每行按下列格式描述一条道路:
    P1 P2 Dist
    其中P1和P2是道路两端点的编号,端点可以是居民点,也可以是垃圾箱候选点。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
    

    题意有点坑,一共最多1000人,数据不算大,对每个位置都进行dijkstra,然后进行筛选。
    代码:
    #include <bits/stdc++.h>
    using namespace std;
    #define inf 0x3f3f3f3f
    /*输入第一行给出4个正整数:N(<= 103)是居民点的个数;M(<= 10)是垃圾箱候选地点的个数;K(<= 104)是居民点和垃圾箱候选地点之间的
    道路的条数;DS是居民点与垃圾箱之间不能超过的最大距离。所有的居民点从1到N编号,所有的垃圾箱候选地点从G1到GM编号。
    随后K行,每行按下列格式描述一条道路:
    P1 P2 Dist
    其中P1和P2是道路两端点的编号,端点可以是居民点,也可以是垃圾箱候选点。Dist是道路的长度,是一个正整数。
    int n,m,k,ds;
    */
    int n,m,k,ds,dist,g;
    double mdis,adis;
    int mp[1020][1020];
    int dis[1020],visited[1020];
    int main()
    {
        char s1[10],s2[10];
        cin>>n>>m>>k>>ds;
        memset(mp,inf,sizeof(mp));
        for(int i = 0;i < k;i ++)
        {
            cin>>s1>>s2>>dist;
            int x = s1[0] == 'G' ? atoi(s1 + 1) + n : atoi(s1);///下次注意 别再用s1[1] - '0',不一定是一位数
            int y = s2[0] == 'G' ? atoi(s2 + 1) + n : atoi(s2);
            mp[x][y] = mp[y][x] = dist;
        }
        for(int i = 1;i <= m;i ++)
        {
            int c = 0;///计算一共记录几个人
            memset(dis,inf,sizeof(dis));///
            memset(visited,0,sizeof(visited));///初始化
            dis[i + n] = 0;
            double mdi = inf,adi = 0;///mdi记录最小距离 adi记录总的距离和
            for(int j = 1;j <= n + m;j ++)
            {
                int u = inf;
                for(int k = 1;k <= n + m;k ++)
                {
                    if(visited[k])continue;
                    if(u == inf || dis[k] < dis[u])u = k;
                }
                if(u == inf)break;
                visited[u] = 1;
                if(u <= n)
                {
                    if(dis[u] > ds)
                    {
                        break;
                    }
                    c ++;
                    adi += dis[u];
                    if(dis[u] < mdi)mdi = dis[u];
                }
                for(int k = 1;k <= n + m;k ++)
                {
                    if(visited[k])continue;
                    if(dis[u] + mp[u][k] < dis[k])dis[k] = dis[u] + mp[u][k];
                }
            }
            if(c == n)
            {
                if(mdis < mdi)g = i,mdis = mdi,adis = adi;
                else if(mdis == mdi)
                {
                    if(adis > adi)g = i,adis = adi;
                }
            }
        }
        if(g)printf("G%d
    %.1f %.1f",g,mdis,adis / n);
        else printf("No Solution");
    }
  • 相关阅读:
    原型,构造函数,实例,__proto__
    To me
    那么再会吧!OI!(HNOI2019退役记)
    中山纪念中学培训杂题(难的都不在这里面qwq)
    关于菜鸡我
    树链剖分讲解
    [luogu] P4823 [TJOI2013]拯救小矮人(贪心)
    [luogu] P4551 最长异或路径(贪心)
    [luogu] P4364 [九省联考2018]IIIDX(贪心)
    [luogu] P4155 [SCOI2015]国旗计划(贪心)
  • 原文地址:https://www.cnblogs.com/8023spz/p/8605678.html
Copyright © 2011-2022 走看看