C语言 垃圾箱分布 (15 分),PAT L3-005. 垃圾箱分布 26分 测试点4 过不了

PAT L3-005. 垃圾箱分布 26分 测试点4 过不了

PAT L3-005. 垃圾箱分布 26分 测试点4 过不了

题目描述

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

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

输入格式

输入第一行给出4个正整数:N(≤10^3?? )是居民点的个数;M(≤10)是垃圾箱候选地点的个数;K(≤10^4?? )是居民点和垃圾箱候选地点之间的道路的条数;D?S?? 是居民点与垃圾箱之间不能超过的最大距离。所有的居民点从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

测试点4过不了,难受……

e8169b1d13cb3b5db6677094f6179851.png

C++ 代码

#include

using namespace std;

const int N = 1e3+20;

int g[N][N];

int n,m,k,Ds,dis[N];

bool st[N];

int ans=-1;

double minD=-1,minavg;

void bfs(int start)

{

memset(st,0,sizeof st);

memset(dis,0x3f,sizeof dis);

dis[start]=0;

queue q;

q.push(start);

st[start]=true;

while(q.size())

{

auto t = q.front();

q.pop();

for(int i=1;i<=n+m;i++)

{

dis[i]=min(dis[i],dis[t]+g[t][i]);

if(!st[i] && g[t][i]<0x3f3f3f3f/2)

{

q.push(i);

st[i]=true;

}

}

}

double mind=0x3f3f3f3f,avg=0;

for(int i=1;i<=n;i++)

{

if(dis[i]>Ds) return ;

avg+=(double)dis[i];

if(mind>dis[i]) mind=dis[i];

}

avg=(double)((avg+0.05)/double(n)); //保留一位小数,+0.05

mind=(double)(mind+0.05);

if(mind > minD)

{

ans = start-n;

minD = mind;

minavg = avg;

}

else if(mind == minD && avg < minavg)

{

ans = start-n;

minavg = avg;

}

}

int main()

{

memset(g,0x3f,sizeof(g));

cin>>n>>m>>k>>Ds;

string a,b;

int d;

for(int i=0;i

{

int a1,b1;

cin>>a>>b>>d;

if(a[0]=='G')

{

a=a.substr(1);

a1=stoi(a)+n;

}

else a1=stoi(a);

if(b[0]=='G')

{

b=b.substr(1);

b1=stoi(b)+n;

}

else b1=stoi(b);

//cout<

g[a1][b1]=g[b1][a1]=d;

}

for(int i=n+1;i<=n+m;i++)

{

bfs(i);

}

if(ans==-1) puts("No Solution");

else{

cout<

printf("%.1f %.1f",minD,minavg);

}

return 0;

}

PAT L3-005. 垃圾箱分布 26分 测试点4 过不了相关教程

JSONPath表达式

JSONPath表达式 JSONPath是一种简单的方法来提取给定JSON文档的部分内容。JSONPath提供的json解析非常强大,它提供了类似正则表达式的语法,基本上可以满足所有你想要获得的json内容。 1、操作符 ?:问号,标记表达式的开头。使用的语法 [?(表达)] 例如:[

pat 1086 Tree Traversals Again

pat 1086 Tree Traversals Again 用自己的思路就会出错……折磨死了。自己还是太菜了。 边遍历边建树 /*思路:建树*/#include iostream#include vector#include stack#include stringusing namespace std;struct Node{ int data; Node *left; Node *right; No

1071 Speech Patterns (25分)(map的常见用法)

1071 Speech Patterns (25分)(map的常见用法) 题目描述如下: 题目大致意思: 输出在一个字符串中出现次数最多的单词和其出现的次数。 大致思路: 先对字符串进行遍历,每当遇到分割符时,就把两个分隔符之间的字符串单独拿出,使用map来统计每个字符串出现

6.建造者模式

6.建造者模式 建造者模式 建造者模式(Builder Pattern) :使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 **主要解决:**主要解决在软件系统中,有时候面临着一个复杂对象的创建工

Python PAT乙级 1068 万绿丛中一点红 (20分) 成功

Python PAT乙级 1068 万绿丛中一点红 (20分) 成功 对于计算机而言,颜色不过是像素点对应的一个 24 位的数值。现给定一幅分辨率为 MN 的画,要求你找出万绿丛中的一点红,即有独一无二颜色的那个像素点,并且该点的颜色与其周围 8 个相邻像素的颜色差充分大。

Mysql存储过程生成树路径path

Mysql存储过程生成树路径path 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、先对表添加路径字段 二、写存储过程 1.代码如下 2.存储过程解读 总结 前言 因为项目里面的组织架构表没有保存组织路径,导致写sql查询不易

Could not create FileSystem for highly available storage pat

Could not create FileSystem for highly available storage path (hdfs://node7-1/flink/ha/flinkCluster) hadoop , zookeeper,工作正常,flink-standalone 启动正常。在搭建HA集群时,集群启动未报错,查看jps时发现没有进程,查看日志出现如下内容: 具体

Redundant Paths POJ - 3177(tarjan 双联通分量)这次是模板总

Redundant Paths POJ - 3177(tarjan 双联通分量)这次是模板总集 Redundant Paths POJ - 3177 题意: 给你一个无向图。问你最少添加几条边可以达到任意pair之间都是双联通。 思路: 本题要保证任意pair双联通。可以先求下双联通分量。 之后进行缩点。 观察下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值