L3-005. 垃圾箱分布

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

现给定一个居民区的地图,以及若干垃圾箱的候选地点,请你推荐最合适的地点。如果解不唯一,则输出到所有居民点的平均距离最短的那个解【此处为第二重排序的原则】。如果这样的解还是不唯一,则输出编号最小的地点【此处为第三重排序的原则,尽管遍历的时候是按顺序的,但sort排序的时候不是有序进行比较的(具体自己百度sort百度原理),所以比较加上这条!】。

输入格式:

输入第一行给出4个正整数:N(<= 103)是居民点的个数【在这里也WA了一次,因为编号是123的时候就需要来一个while循环进行字符串转数字了】;M(<= 10)是垃圾箱候选地点的个数;K(<= 104)是居民点和垃圾箱候选地点之间的道路的条数;DS是居民点与垃圾箱之间不能超过的最大距离【这里不用double来存贮其实也是可以过的,WA了第六遍的时候我以为是数据超int了需要用double来存,貌似是无用的】。所有的居民点从1到N编号,所有的垃圾箱候选地点从G1到GM编号。

随后K行,每行按下列格式描述一条道路:
P1 P2 Dist
其中P1和P2是道路两端点的编号,端点可以是居民点,也可以是垃圾箱候选点。Dist是道路的长度,是一个正整数。

输出格式:

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


AC代码:题目一般吧,细节仔细都能考虑到的。

 #include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<set>
#include<vector>
#include<string>
#include<stack>
#define inf 0x3f3f3f3f
#define dinf 0x7fffffff*1.0
using namespace std; //L3-005,垃圾箱,16:50--
#define N 1200
#define ll long long
struct node{
int x;
double d;
node(int x=,double d=0.0):x(x),d(d){}
};
struct node1{
int id;
double minn,ave;
node1(int id=,double minn=-,double ave=-):id(id),minn(minn),ave(ave){}
}ans[];
//1--到所有居民点的最短距离 相比较最长的地方,2-相等时,按平均距离最短的那个解
bool cmp(node1 a,node1 b){
if(fabs(a.minn-b.minn)<1e-){
if(fabs(a.ave-b.ave)<1e-)
return a.id<b.id;
else
return a.ave<b.ave;
}
else
return a.minn>b.minn;
}
vector<node>G[N];//垃圾箱就是把垃圾箱自身编号加上N
double dis[N];
int vis[N];
int n,m,k;
double ds;//一个阈值
int cnt;
void debug(int num){
printf("gar:%d--",num);double s=;
for(int i=;i<=n+m;i++){
s+=dis[i];
printf(" %.0lf",dis[i]);
}
cout<<" s: "<<s<<endl;
} void spfa(int ed){
queue<int>Q;
for(int i=;i<N;i++)
dis[i]=dinf;
memset(vis,,sizeof(vis));
Q.push(ed);
int u,v;
dis[ed]=0.0; while(Q.size()>){
u=Q.front();Q.pop();
vis[u]=;
for(int i=;i<(int)G[u].size();i++){
v=G[u][i].x;
if(dis[v]>dis[u]+G[u][i].d){
dis[v]=dis[u]+G[u][i].d;
if(!vis[v]){
Q.push(v);
vis[v]=;
}
}
}
}
double minn=dinf;
double sum=0.0;
for(int i=;i<=n;i++){
if(dis[i]>ds)return ;
sum+=dis[i];
minn=min(minn,dis[i]);
}
ans[++cnt]=node1(ed,minn,sum/(1.0*n) );
}
int fact(char ch[]){
int x=,i=;
if(ch[]=='G'){
i=;
}
while(ch[i]!='\0'){
x =x*+ch[i]-'' ;
i++;
}
if(ch[]=='G')x+=n;
return x;
}
int main(){
char ch1[],ch2[];
while(scanf("%d%d%d%lf",&n,&m,&k,&ds)!=EOF){
for(int i=;i<N;i++)
G[i].clear();
cnt=;//统计加入ans结构体的个数
int x,y;
double dist;
for(int i=;i<=k;i++){
scanf("%s%s%lf",ch1,ch2,&dist);
x=fact(ch1);
y=fact(ch2);
G[x].push_back(node(y,dist));
G[y].push_back(node(x,dist));
} for(int i=+n;i<=n+m;i++)
spfa(i);
if(cnt==){
printf("No Solution\n");
}
else{
sort(ans+,ans++cnt,cmp);
printf("G%d\n",ans[].id-n);
printf("%.1lf %.1lf\n",ans[].minn,ans[].ave);
}
} return ;
}

(这题没有负权环,数据量真的水,所以无论用那种最短路算法都可以——我用的spfa算法)

【最短路+较复杂处理】PAT-L3-005. 垃圾箱分布的更多相关文章

  1. PAT L3-005. 垃圾箱分布

    最短路. 枚举垃圾箱放哪里,然后算最短路. #include<map> #include<set> #include<ctime> #include<cmat ...

  2. PAT 垃圾箱分布(30分)dijstra

    垃圾箱分布 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 大家倒垃圾的时候,都希望垃圾箱距离自己比较近,但是谁都不愿意守着垃圾 ...

  3. PAT天梯赛L3-005 垃圾箱分布

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

  4. PAT天梯赛练习题——L3-005. 垃圾箱分布(暴力SPFA)

    L3-005. 垃圾箱分布 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 大家倒垃圾的时候,都希望垃圾箱距离自己比较近,但是谁 ...

  5. PAT天梯赛练习题 L3-010. 是否完全二叉搜索树(完全二叉树的判断)

    L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜 ...

  6. PTA刷题笔记

    PTA刷题记录 仓库地址: https://github.com/Haorical/Code/tree/master/PTA/GPLT 两周之内刷完GPLT L2和L3的题,持续更新,包括AK代码,坑 ...

  7. L3-005. 垃圾箱分布

    L3-005. 垃圾箱分布 题目链接:https://www.patest.cn/contests/gplt/L3-005 Dijstra 与L2-001.紧急救援类似,是Dijstra最短路的拓展, ...

  8. PAT甲级专题|最短路

    PAT甲级最短路 主要算法:dijkstra 求最短最长路.dfs图论搜索. 1018,dijkstra记录路径 + dfs搜索路径最值 25分,错误点暂时找不出.. 如果只用dijkstra没法做, ...

  9. 【PAT L2-001】最短路计数

    给定一个无向带权网络,无负边,无重边和自环,每个顶点有一个正数权值.首先求特定原点s到终点d的最短路的个数:然后求所有最短路中顶点权值a[i]之和最大的那条,输出这条路径. 可用dijkstra算法求 ...

随机推荐

  1. openfoam耦合liggghts安装

    本次安装基于新安装的ubuntu18.04LTS桌面版系统,用户名为ubuntu,此前未安装其他软件(进行了系统提醒的更新),安装时间为2019年9月. 安装前需确认需要安装的OpenFOAM版本,C ...

  2. python实践项目一:Collatz函数

    要求1:编写一个名为 collatz()的函数,它有一个名为 number 的参数.如果参数是偶数,那么 collatz()就打印出 number // 2, 并返回该值.如果 number 是奇数, ...

  3. 03 CSS听课笔记

    CSS:页面美化和布局控制 1. 概念: Cascading Style Sheets 层叠样式表层叠:多个样式可以作用在同一个html的元素上,同时生效 2. 好处:(1)功能强大(2)将内容展示和 ...

  4. Javascript 闭包何时回收?

    定义 闭包是函数和声明该函数的词法环境的组合.闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量. 范例 fun ...

  5. Redis搭建Windows平台

    安装程序下载 从官网下载安装程序. https://redis.io/download https://github.com/MicrosoftArchive/redis/releases 新地址:h ...

  6. python openpyxl模块实现excel的读取,新表创建及原数据表追加新数据

    当实际工作需要把excel表的数据读取出来,或者把一些统计数据写入excel表中时,一个设计丰富,文档便于寻找的模块就会显得特别的有吸引力,本文对openpyxl模块的一些常见用法做一些记录,方便工作 ...

  7. centos7安装php7.3的redis扩展(不是redis服务!)

    PHP其他扩展加装扩展也是一样的步骤~ PHP官网下载redis扩展: http://pecl.php.net/package/redis 稳定版吧: [root@wf ~]# wget http:/ ...

  8. HCIA SWITCHING&ROUTTING 笔记——第一章 TCP/IP基础知识(2)

    视频地址:https://ilearningx.huawei.com/courses/course-v1:HuaweiX+EBGTC00000336+Self-paced/courseware/abb ...

  9. go guid 和uuid生成

    1 安装 开始-运行 输入 cmd 回车 输入 go get -u github.com/typa01/go-utils 安装完毕后 2 使用 a 首先引入包 import (      goutil ...

  10. hdu 2822 ~!!!!!!坑死我

    首先 在此哀悼...  为我逝去的时间哀悼...  每一步都确定再去写下一步吧...日狗 不过还是有点收获的..  对优先队列的使用 有了进一步的理解 先上代码 #include<iostrea ...