博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PAT天梯赛练习题——L3-005. 垃圾箱分布(暴力SPFA)
阅读量:4337 次
发布时间:2019-06-07

本文共 2205 字,大约阅读时间需要 7 分钟。

 

L3-005. 垃圾箱分布

时间限制
200 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越

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

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

输入格式:

输入第一行给出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 51 2 21 4 21 G1 41 G2 32 3 22 G2 13 4 23 G3 24 G1 3G2 G1 1G3 G2 2
输出样例1:
G12.0 3.3
输入样例2:
2 1 2 101 G1 92 G1 20
输出样例2:
No Solution
 

刚开始题目意思比较难理解:选在到所有居民点的最短距离最长的地方。首先知道题目中对答案的限制条件只有一个,那就是最大距离不能超过Ds,那么对在此基础上筛选下来的候选位置中计算他们各自的到所有居民区的最短距离,比如我G1到1号1米,2号2米,3号3米;G2到1号6米,到2号5米,到3号10米,那么G1的最短就是1米(一号),G2的最短距离就是5米(二号)。

 

以此类推对每一个筛选出来的候选位置都计算对应的min_dx。然后当然此前要对筛选出来的答案存放到数组,然后排序一下。这题比较杯具的是交了N多次,刚开始是用map写邻接表,超时,改为vector,终于不超时了,可是总是最后一个组WA,不解,接着改啊改……WA数次之后发现是自定义排序规则里一个变量写错了。真的是无语了。原本还以为这题的坑点是不一定1~N的所有点和垃圾桶位置,还搞了个set存放位置,现在看来题目还是比较友好的……

代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define INF 0x3f3f3f3f#define MM(x) memset(x,0,sizeof(x))using namespace std;typedef long long LL;const int N=10020;typedef pair
psd;vector
E[1050];double d[N];int n,m,k;double ds;inline int bianhao(char s[]){ int len=strlen(s); int r=0; if(s[0]=='G') { for (int i=1; i
>Q; Q.push(pair
(-d[s],s)); while (!Q.empty()) { int now=Q.top().second; Q.pop(); for (int i=0; i
d[now]+E[now][i].second) { d[v]=d[now]+E[now][i].second; Q.push(pair
(-d[v],v)); } } }}struct info{ int s; double aver,sum,minm; info(const int &ss,const double &av,const double &su,const double &mm):s(ss),aver(av),sum(su),minm(mm){} info(){}};bool cmp(const info &a,const info &b){ if(a.minm!=b.minm) return a.minm>b.minm;//就是这个地方写成了a.minm>b.sum,强行WA数次- - if(a.aver!=b.aver) return a.aver
ds) { flag=0; break; } sss+=tj; if(tj

转载于:https://www.cnblogs.com/Blackops/p/5766331.html

你可能感兴趣的文章
基于ZooKeeper的分布式Session实现(转)
查看>>
oracle特殊需求:从其他数据库表复制数据至本地数据库表,数据不能重复
查看>>
Typescript高级类型与泛型难点详解
查看>>
微信-商城商品的图文/商品链接分享(后台数据合成图片+二维码生成)
查看>>
jquery tab mouseover 特效
查看>>
日本語を勉強するの日記(四)
查看>>
Python环境的安装
查看>>
Python简介以及入门
查看>>
Combination-Sum II
查看>>
Next Permutation
查看>>
《算法导论》CLRS算法C++实现(九)P109 选择数组中第i小(大)的数 顺序统计量...
查看>>
Template基础
查看>>
vue项目如何打包扔向服务器
查看>>
Observer(观察者)
查看>>
nodejs vinyl-fs 处理文件时输入问题
查看>>
HDU - 2602 Bone Collector
查看>>
虚拟机静态IP配置
查看>>
今天遇到了一个问题,将应用程序从服务器读取到的电话号码存储到通讯录中,必须在真机上跑,有点小激动。...
查看>>
python不换行输出
查看>>
Jexus部署Asp.Net Core项目
查看>>