【最短路+较复杂处理】PAT-L3-005. 垃圾箱分布
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. 垃圾箱分布的更多相关文章
- PAT L3-005. 垃圾箱分布
最短路. 枚举垃圾箱放哪里,然后算最短路. #include<map> #include<set> #include<ctime> #include<cmat ...
- PAT 垃圾箱分布(30分)dijstra
垃圾箱分布 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 大家倒垃圾的时候,都希望垃圾箱距离自己比较近,但是谁都不愿意守着垃圾 ...
- PAT天梯赛L3-005 垃圾箱分布
题目链接:点击打开链接 大家倒垃圾的时候,都希望垃圾箱距离自己比较近,但是谁都不愿意守着垃圾箱住.所以垃圾箱的位置必须选在到所有居民点的最短距离最长的地方,同时还要保证每个居民点都在距离它一个不太远的 ...
- PAT天梯赛练习题——L3-005. 垃圾箱分布(暴力SPFA)
L3-005. 垃圾箱分布 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 大家倒垃圾的时候,都希望垃圾箱距离自己比较近,但是谁 ...
- PAT天梯赛练习题 L3-010. 是否完全二叉搜索树(完全二叉树的判断)
L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜 ...
- PTA刷题笔记
PTA刷题记录 仓库地址: https://github.com/Haorical/Code/tree/master/PTA/GPLT 两周之内刷完GPLT L2和L3的题,持续更新,包括AK代码,坑 ...
- L3-005. 垃圾箱分布
L3-005. 垃圾箱分布 题目链接:https://www.patest.cn/contests/gplt/L3-005 Dijstra 与L2-001.紧急救援类似,是Dijstra最短路的拓展, ...
- PAT甲级专题|最短路
PAT甲级最短路 主要算法:dijkstra 求最短最长路.dfs图论搜索. 1018,dijkstra记录路径 + dfs搜索路径最值 25分,错误点暂时找不出.. 如果只用dijkstra没法做, ...
- 【PAT L2-001】最短路计数
给定一个无向带权网络,无负边,无重边和自环,每个顶点有一个正数权值.首先求特定原点s到终点d的最短路的个数:然后求所有最短路中顶点权值a[i]之和最大的那条,输出这条路径. 可用dijkstra算法求 ...
随机推荐
- Deep Learning Recommendation Model for Personalization and Recommendation Systems
这篇文章出自facebook,主要探索了如何利用类别型特征(categorical features)并且构建一个深度推荐系统.值得注意的是,文章还特别强调了工业实现上如何实现并行,也很良心地给出了基 ...
- LeetCode 414. 第三大的数(Third Maximum Number) 3
414. 第三大的数 414. Third Maximum Number 题目描述 给定一个非空数组,返回此数组中第三大的数.如果不存在,则返回数组中最大的数.要求算法时间复杂度必须是 O(n). 每 ...
- [转帖]“腾百万”之后,腾讯的云操作系统VStation单集群调度达10万台
“腾百万”之后,腾讯的云操作系统VStation单集群调度达10万台 https://www.leiphone.com/news/201909/4BsKCJtvvUCEb66c.html 腾讯有超过1 ...
- 以php中的比较运算符操作整型,浮点型,字符串型,布尔型和空类型
字符,数字,特殊符号的比较依赖ASC II表,本表原先有127个,后来又扩充了一些,里面包含了奇奇奇怪的符号. ASC II表 https://baike.baidu.com/item/ASCII/3 ...
- smarty中常用的流程控制逻辑
if else {if $age > 18} <div>年满十八岁!</div> {else if $age > 16} <div>年满十六岁!< ...
- Ubuntu下编译 Hadoop2.9
Ubuntu 下编译 Hadoop-2.9.2 系统环境 系统: ubuntu-18.10-desktop-amd64 maven: Apache Maven 3.6.0 jdk: jdk_1.8.0 ...
- vue的data里面的值是数组时,在更改其某一项的时候,怎么触发视图的重新渲染?
1. 设置对象或数组的值:Vue.set(target,key,value) :2.删除对象或数组中元素: Vue.delete ( target,key) ;3. 数组对象直接修改属性,可以触发视图 ...
- vue打包后.woff字体文件路径问题处理
在执行 npm run build 命令打包后,如果出现 .woff 等字体文件找不到的情况 通过设置 vue-style-loader 打包前缀路径解决
- springboot 常见的启动器
<!--pringBoot提供了一个名为spring-boot-starter-parent的工程, 里面已经对各种常用依赖(并非全部)的版本进行了管理 我们的项目需要以这个项目为父工程,这样我 ...
- sysfs和kobject
sysfs文件系统: sysfs是2.6内核的一个特性,它允许内核代码经由一个in-memory的文件系统把信息出报(export)到用户进程中. 在设备模型中,sysfs文件系统用来表示设备的结构. ...