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. BP神经网络设计常用的基本方法和实用技术

    尽管神经网络的研究和应用已经取得巨大成功,但在网络的开发设计方面至今仍没有一套完善的理论做指导,应用中采取的主要设计方法是,在充分了解待解决问题的基础上将经验与试探相结合,通过多次改进性试验,最终选出 ...

  2. 修改 ubuntu NTFS 文件系统下没有执行权限的问题

    由于NTFS本身的特殊性,不能对其分区的文件权限进行修改,无论是sudo还是root都没有用. 安装以下两个插件解决问题: sudo apt-get install ntfs-3g //这个12.04 ...

  3. Servlet 表单及上传文件

    // 文件路径 D:\ApacheServer\web_java\HelloWorld\src\com\test\TestServletForm.java package com.test; impo ...

  4. 通俗理解TCP的三次握手

    三次握手流程的本质,可以这么理解:TCP的三次握手其实是双方各一次握手,各一次确认,只是其中一次握手和确认合并在一起. 当然也可以更通俗的去理解: "喂,你听得到吗?" " ...

  5. Thinking In Java 4th Chap8 多态(未完)

    多态的意义:改善代码的可读性并且使得程序“可扩展” 多态方法调用允许一种类型表现出与其他相似类型之间的"区别",基于方法的行为不同而表现出来 将一个方法调用同一个方法主体关联起来称 ...

  6. Echarts设置y轴值间隔 以及设置 barWidth : 30,//柱图宽度

    需求:如图,y轴之间的距离太小,这样就太过于拥挤了,现在要修改echarts里面的属性,设置y轴值间隔让图表看上去舒服一些.     其实很多问题,真的只是因为自己没有好好的看文档,很多文档上面都写的 ...

  7. AS3动画效果常用公式

    缓动公式: sprite.x += (targetX – sprite.x) * easing;//easing为缓动系数变量 sprite.y += (targetY – sprite.y) * e ...

  8. react组件懒加载

    组件懒加载方式-:react新增的lazy const Alert = lazy(() => import('./components/alert')); export default func ...

  9. linux学习之路(三)--centos7安装mysql(单点)

    1.先检查系统是否装有mysql rpm -qa | grep mysql 返回空值,说明没有安装. 这里执行安装命令是无效的,因为centos-7默认是Mariadb,所以执行以下命令只是更新Mar ...

  10. Centos7+puppet+foreman,实现部署OS

    一.简介 1. 需要实现操作系统的部署 foreman提供了一个基于kickstart的部署工具,输入一台服务器的部署网卡的mac地址和hostname.ip等信息,就能自动的帮我们部署完,并且,还可 ...